您的位置:首页 > 其它

2011-09-06周二

2011-09-09 11:07 162 查看
十三、章多线程
第二节线程的生命周期及线程的同步
一、 线程的生命周期

线程的生命周期包含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++

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: