JAVA多线程之——线程之间的通信
来源:互联网 发布:airplay软件下载 编辑:程序博客网 时间:2024/05/17 20:29
概要
我们知道线程是操作系统中一个独立的个体,在一般多线程环境下,我们希望的是各个线程之间有一定的关联,使得各个线程组合成一个整体工作。那么就必须要使线程之间互相能传递信息。这就是线程之间需要通信。线程通信可以采取wait/notify 方法实现通信(当然还有其它通信方式。这节只学习wait/notify 方法)。
wait/notify定义
1.wait/notify方法定义在Object类中。这说明JAVA中多有对象都拥有wait/notify方法。那么为什么wait/notify方法是用来实现线程之间的通信,为何不定义在Thread中呢?首先看一下源码:
/**The current thread must own this object's monitor. The thread * releases ownership of this monitor and waits until another thread * notifies threads waiting on this object's monitor to wake up * */ public final void wait() throws InterruptedException { wait(0); }官方文档中开头的一段解释就是,使用wait方法,那么当前的线程必须要是某个对象的监控者。换句话说,就是要使用wait方法就必须要拥有某个对象的锁。也就是说wait/notify依赖于对象锁。而锁可以是任意一个对象都可以拥有。那么就意味着必须任意的对象都可以调用wait/notify方法。那么这些方法就只能定义在Object中。**wait/notify使用**
public class ThreadTest3 {
private volatile int i = 0;public void method1() { i++;}public int getI() { return i;}public static void main(String[] args) { final ThreadTest3 test3 = new ThreadTest3(); final Object lock = new Object(); Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized (lock) { try { for (int k = 0; k < 10; k++) { test3.method1(); System.out.println("i自增1 "); if (test3.getI() == 5) { System.out.println("发出通知。。。。。。"); lock.notify(); } Thread.currentThread().sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } } }, "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { synchronized (lock) { if(test3.getI() != 5) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println("收到通知。。。。。。。。。停止工作"); throw new RuntimeException(); } }, "t2"); t2.start(); t1.start();}
}
上述代码运行结果:
i自增1
i自增1
i自增1
i自增1
i自增1
发出通知。。。。。。
i自增1
i自增1
i自增1
i自增1
i自增1
收到通知。。。。。。。。。停止工作
Exception in thread “t2” java.lang.RuntimeException
at thread.day2.ThreadTest3$2.run(ThreadTest3.java:61)
at java.lang.Thread.run(Thread.java:745)
“`
结果分析:当我们启动先启动t2线程时候,获取了lock的锁,第一次进去i不等与5,t2调用wait方法进入等待,然后t1获取lock同步锁,对i进行自增,在等于5的时候,发出通知调用notify方法。但运行的结果是知道t1运行完成后。t2才执行了停止工作。
结果总结:
1.wait释放所。并且wait方法是停止当前拥有该对象同步锁的线程
2.notify不释放锁
- JAVA多线程之——线程之间的通信
- Win32多线程之线程之间的通信
- java多线程(三)线程之间的通信
- java 多线程 线程之间的通信
- 多线程-线程之间的通信
- java学习之路——线程3(线程之间的通信)
- Java多线程之线程的通信
- Java 多线程编程之六:线程之间的通信(附源代码)
- Java 多线程编程之六:线程之间的通信(附源代码)
- Java 多线程编程之六:线程之间的通信(附源代码)
- JAVA基础学习(十二)--多线程一线程之间的通信
- Java多线程(3) 线程之间通信
- java多线程之线程通信
- 黑马程序员:Java基础——多线程之间的通信
- java多线程之间的通信
- Java多线程之间的通信
- java 多线程之间的通信
- java基础——多线程之间通信
- 【转】Python 包管理工具解惑【原文:http://zengrong.net/post/2169.htm】
- Android实用功能分享——应用版本的更新实例
- Java操作数据库的步骤
- iOS的内存管理
- 页面返回历史上一页并且刷新
- JAVA多线程之——线程之间的通信
- uva532
- SAP Vora(SAP HANA和Hadoop)简析
- 硬盘管理与RAID阵列
- java后台开发之json数据字符串转map进行传参
- 论解决问题的方法论
- 用实施驱动优化
- linux网络通信之concurrency模型fork
- iOS中的谓词(NSPredicate)使用