1、Java多线程技能 -- Java多线程编程核心技术

1、进程和多线程的概念及线程的优点

进程概念:
	可以将运行在内存中的一个个的exe文件理解为一个个的进程

线程概念:
	线程可以理解为进程中一个个独立运行的子任务,比如QQ是一个进程,而QQ中
的传文件、发消息等就是一个个的线程。
  
多线程的优点:
	当有多个任务在使用单线程的方式执行时,一个任务开始之后,另一个任务只
能在开始的任务结束之后才能开始执行,即同步执行,CPU的利用率会大幅降低。
	而使用多线程的方式执行多个任务时,不同的任务之间可以来回切换,即异步
执行,提升CPU的利用率。

2、使用多线程

	一个进程正在运行时,至少会有一个线程正在运行。

	实现多线程的编程方式主要有两种,一种是继承Thread类,一种是实现
Runnable接口。Thread类的内部是实现了Runnable接口的。

	在多线程中,代码的运行结果跟代码的执行顺序是无关的。同时,执行start
()方法的顺序也不代表线程启动的顺序,start()方法调用之后,只是代表着该线
程已经准备就绪,等待调用该线程对象的run()方法,而不一定是马上就调用run()
方法。

	synchronized关键字可以在任意对象及方法上加锁,而加锁的这段代码被称
为“互斥区”或者“临界区”。当某个方法上被加锁之后,该方法开始执行之后就不会
中途停止,直到该方法运行结束之后,其他的线程才能够开始执行。

3、Thread类的常用API

3.1 currentThread()方法
	currentThread()方法可返回代码段正在被哪个线程调用的信息。
	Thread.currentThread().getName()返回当前线程的名称。
	Thread.currentThread()和this的区别:
		this表示的是当前的对象实例,Thread.currentThread()表示的调用当前
		代码的线程。
		
3.2 isAlive()方法
	方法isAlive()的功能是判断当前线程是否处于活动状态。
	
3.3 sleep()方法
	让当前正在执行的线程暂停执行指定的毫秒数,正在执行的线程this.
	currentThread()返回的线程。
	this.currentThread()和Thread.currentThread()是相同的。
	执行sleep()方法的线程,在指定时间内不会再被执行。
	
3.4 getId()方法
	获取线程的唯一标识。

3.5 停止线程的方法
	有三种方法可以终止正在运行的线程:
	1、当run()方法结束之后,线程自动终止;
	2、使用stop()方法,但是不推荐使用这种方法,因为stop和suspend及
	resume一样,都是过期作废的方法。
	3、使用interrupt方法中断线程,推荐这种方式。
		单纯的使用interrupt方法不能让线程停止,通常是跟抛异常法相结合来
		让线程停止。
		使用this.interrupted()和this.isInterrupted()方法来判断线程
		是否停止,这两种方法的区别:
		this.interrupted()表示的调用当前代码的线程是否中断,具有清除
		状态的功能。
		this.isInterrupted()表示的是当前对象的线程是否中断,不具有清
		除状态的功能。
		在sleep状态下,不能停止线程,否则会抛出异常。

3.6 暂停线程的方法
	使用suspend()方法停止线程,使用resume()方法恢复线程的执行。
	缺点:独占、不同步。

3.7 yield()方法
	该方法的作用是暂时放弃当前的CPU资源,将它让给其他的任务去占用CPU资
	源。但是yield只是暂时放弃CPU,放弃之后,马上又会跟其他线程一起竞争
	CPU。

4、线程的优先级

线程可以划分优先级,优先级较高的线程的到的CPU资源较多。
线程的优先级跟代码的执行顺序无关。
线程的优先级具有继承性,A线程调用B线程,则A和B线程的优先级相同。
优先级高的线程不一定比优先级低的线程先被调用,只是先被调用的可能性高。
this.setPriority(a)设置线程的优先级。
this.getPriority()返回线程的优先级。

5、守护线程

守护线程就是为非守护线程服务的,当非守护线程全部不存在的时候,守护线程也会
自动停止。
this.setDaemon(true)设置当前线程为守护线程。

你可能感兴趣的:(多线程)