扫一扫,加我们为好友有惊喜哦~
-->

核心课程
开班动态
专题服务

您当前所在位置:首页 > 中心动态 >>
多线程编程——软件开发课程

 

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]


返回顶部