首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

以小见大,一段简略的多线程代码

2012-10-13 
以小见大,一段简单的多线程代码? ?下面是一段简单的java多线程代码? public static void main(String[] ar

以小见大,一段简单的多线程代码

? ?下面是一段简单的java多线程代码

?

 public static void main(String[] args) throws Exception {final Object lock="";Thread t1=new Thread(){public void run(){try {System.out.println("t1 wait begin");synchronized (lock) {lock.wait();}System.out.println("t1  wait end");} catch (InterruptedException e) {e.printStackTrace();}}};t1.start();Thread.sleep(5000);        System.out.println("main lock begin");synchronized (lock) {lock.notify();Thread.sleep(10000);System.out.println("main wait begin ");lock.wait();System.out.println("main wait end");}System.out.println("main lock end");t1.join();System.out.println("process exist"); }

?输出:

t1 wait beginmain lock beginmain wait begin t1  wait end

?

描述:

? ? ? ? 线程t1获取lock对象的监视器后,马上调用lock的wait方法,放弃了lock的监视器,

? ? ? ? 主线程获取lock对象的监视器后,调用lock的notify方法唤醒等待lock的监视器的线程(这里是t1)

? ? ? ? 之后睡眠10秒,然后调用lock的wait方法放弃lock的监视器。

?

结论:

1、wait,notify,notifyAll必须在当前线程获得监视器时才能调用,即这些方法必须在同步块中才能调用

2、t1线程,wait方法执行时,t1线程放弃lock对象的监视器,t1线程阻塞,导致同步块代码未执行完。

3、主线程中notify方法执行时,主线程唤醒在等待lock对象监视器的线程(随机的,t1线程只是被标记为可获取监视 ? ? ? ? ? ?器,但实际未获取,详情请看4),另外此方法并不阻塞而是立即返回。

4、主线程notify方法执行后,主线程仍然具有lock对象的监视器,而t1线程仍处于阻塞状态(虽然已经被主线程notify ? ? ? ? ?了), 这点可以看代码,主线程睡眠10秒,而t1线程仍阻塞。只有当主线程调用wait方法,放弃lock的监视器后,

? ? ?t1线程才真正获得监视器,接着主线程阻塞,而t1线程继续执行同步块中未执行的代码

5、因没有任何线程调用notify方法呼唤主线程了,所以主线程一直阻塞

?

热点排行