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++
}
}
第二节线程的生命周期及线程的同步
一、 线程的生命周期
线程的生命周期包含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++
}
}
相关文章推荐
- 忘了周二都干啥了(2005年9月6日,周二)
- 0701周二
- 090303周二
- 郁闷的周二
- 周二的阶段性成果汇报会
- 11-09-27周二
- 2012-7-10 周二 总结
- 正则表达式周二挑战赛 - 第十周
- 2011-09-06 17:58 Java并发编程:定制线程池的大小
- 2013第50周二eclipse工具尝试
- 2014第10周二程序员思维
- 2014第13周二
- 第24周二
- 2014.08.26 周二-jdbc定义-oracle基本操作
- 第41周二国庆总结
- 第53周二
- hiho一下 第三十七周二分·二分查找之k小数
- 2015第16周二人脉
- 2015第22周二
- 《Java课程实习》日志(周二)