开班动态
![]() |
您当前所在位置:首页 > 中心动态 | >> |
3.4 线程状态
1、线程基本状态:New、Runnable、Running、Blocked、Dead。
注:Java规范中没有Running状态,Running是Runnable状态的一种。
2、线程结束的方式:
线程到达run()方法的末尾;
线程抛出了一个异常或错误;
另一个线程调用stop()方法停止了线程,但是该方法已经过时了。
3.5 线程控制
3.5.1 线程测试
isAlive():查看线程状态,true:线程处于Runnable状态(线程的start()方法被调用)。
false:线程已死或是新线程。
3.5.2 中断线程
Thread.sleep():线程终止执行(睡眠)一定时间,这段时间内,线程一定不执行,时间到了以后线程进入Runnable状态;
Thread.yield():线程放弃运行,并交出CPU的控制权;但之让给优先级比自己高的线程。
注:当一个线程运行时间较长时,会适当调用yield()方法保证其它线程有机会被执行。
3.5.3 线程优先级
1、线程优先级划分:1~10;
2、线程默认优先级:5;
3、默认情况下,子类优先级继承父类优先级,可以通过setProperty()设置优先级。
3.5.3 join()方法
等待另一个线程完成,这个方法开始执行时,调用线程将阻塞,知道被join()方法加入的目标线程完成为止。
3.6 多线程
3.6.1 多线程共享数据
多线程共享数据时可能会出错,因为在线程交替执行,读取数据不能保证读取到当前正确数据。
实例:
public class Test3 implements Runnable{
int count;
public void run() {
// TODO Auto-generated method stub
for(int i = 0;i < 100;i++){
count++;
System.out.println(Thread.currentThread().getName() + " " + count);
}
}
public static void main(String[] args) {
Test3 t3 = new Test3();
Thread t1 = new Thread(t3,"1st");
Thread t2 = new Thread(t3,"2st");
t1.start();
t2.start();
}
}
程序分析:
改程序两个线程共享同样的代码和count数据,同时对count进行增加。最后输出不一定是200,可能比200小,因为两个线程交替读取数据可能有误。
3.6.2 互斥锁
1、为了解决多线程共享数据的问题,使用互斥锁的概念。
2、Java中对象用synchronized修饰表示该对象任一时刻只能由一个线程访问。(即使产生阻塞,线程也不会放弃对对象的占用)
3、Java中使用syschoronized的两种方式:
(1)放在方法前面,调用该方法的线程将获得对象的锁;
(2)放在代码块前面,用于修饰对象引用。
注:synchronized修饰的不是方法或者代码块,而是对象。
synchronized如果用在类前面,表示类中所有方法都是synchronized的。
同步:调用该方法的线程将取得该方法的对象锁。
ArryList、Vector:ArrayList同步;
StringBuffer、StringBuilder:StringBuffer同步;
HashMap、Hashtable:Hashtable同步。
3.6.3 死锁
两个线程都在等待对象释放对象锁。
避免死锁的方法:确保在获取多个锁时,在所有的线程中都以相同的顺序获得锁。
3.6.3 多线程之间通信
wait()方法:让调用线程等待,并放弃对象锁;(可以传入一个参数表示等待多长时间,这样不需要notify()唤醒)
notify():唤醒正在wait的对象;
notifyAll():唤醒所有等待对象。
注:sleep()和wait()有什么区别?(等级1级)
答:1、sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
2、wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
精彩文章推荐
![]() | 如何做好网站架构——常州软件培训 | [2012-7-6] |
![]() | Validation框架验证——常州电脑培训 | [2012-6-30] |
![]() | 插画式简洁Logo设计(二)——常州电脑培训 | [2012-6-27] |
![]() | 常州电脑培训—Java连接mysql数据库(二) | [2012-6-17] |
![]() | 淘宝开店如何在短时间升钻 | [2012-5-5] |
![]() | 整合营销新利器:区域化、精准化、本土化 | [2012-4-21] |
![]() | 淘宝直通车里面的关键词质量的分是什么意思? | [2012-4-19] |
![]() | DreamWeaver常用的操作技巧|常州电脑培训 | [2011-11-14] |