十三、章多线程
第二节线程的生命周期及线程的同步
一、 线程的生命周期
线程的生命周期包含5个状态
1、 新建状态(New)
代表;线程的对象对象已经创建,但是还没有启动,准备工作已经完成。只有程序员调用start()方法,否则线程将保持新建状态而不会运行。
2、 就绪状态(Runnable)
当调用start()方法时,该线程进入就绪状态(只是线程目前处于的状态,如果系统没有能力拔出cpu执行时间给线程,线程就不执行)
3、 运行状态(Run)
线程的正常执行状态,处于该状态的线程在CPU内部执行。
4、 阻塞状态(Block)
线程处于执行状态,但是由于没有获得CPU的执行时间,而处于CPU外部等待线程执行的状态。
5、 终止状态(Dead)
1自然撤销:线程正常退出。
2被停止:应用程序因故障停止运行时,系统将终止给程序的所有线程。
二、 线程的调度
1、睡眠线程sleep()
Sleep()方法使当前线程睡眠(停止执行)若干秒,睡眠时间过后线程再次进入可运行状态。
2、暂停线程yield()
Yield()方法可以暂停当前线程执行,将CPU资源让出来,允许其他线程执行。该线程仍处于可运行状态,不转变为阻塞状态。Yield()方法的优点是保证有工作时不会让CPU闲置,主要用于编写多个合作线程,也适用于强制线程的合作。
3、连接线程join()
调用join()方法可以使当前线程暂停执行,等待调用该方法的线程结束后再执行本行本线程。
4、中断线程interrupt()
为线程设置一个中断标记以便于run()方法时使用isInterrupted()方法能够检测到。
void run() //创建该类的子类时必须实现的方法
void start() //开启线程的方法
static void sleep(long t) //释放CPU的执行权,不释放锁
static void sleep(long millis,int nanos)
final void wait()//释放CPU的执行权,释放锁
final void notify()
static void yied()//可以对当前线程进行临时暂停(让线程将资源释放出来)
三、 线程的同步
线程间共享代码和数据可以节省系统开销,提高程序运行效率,但同时也导致了数据的“访问冲突”问题,如何实现线程间的有机交互、并确保共享资源在某些关键时段只能被一个线程访问,即所谓的“线程同步”(Synchronization)就变得至关重要。
public class Stack {
private char[] data=new char[10];
private int index=0;
public void push(char ch){
data[index]=ch;
System.out.println("压入字符"+ch+"-->");//p1
index++;
System.out.println("-->压入"+ch+"操作完成!");
}
public char pop(){
index--;
return data[index];
}
四、互斥锁
每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
Java对象默认是可以被多个线程共用的,只是在需要时才启动“互斥锁”机制,成为专用对象。
关键字synchronized用来与对象的互斥锁联系
当某个对象用synchronized修饰时,表明该对象已启动“互斥锁”机制,在任一时刻只能由一个线程访问,即使该线程出现堵塞,该对象的被锁定状态也不会解除,其他线程任不能访问该对象。
ü 用在对象前面限制一段代码的执行(同步代码块)
public void push(char c){
sychronized(this){
data[index]=c;
index++
}
}
560

被折叠的 条评论
为什么被折叠?



