Java多线程的通信2
2016-02-20 13:31
417 查看
之前说的是多线程通信最简单,最笨重的一种方式,现在JVM中有一种等待通知机制,可以更好的利用CPU资源,达到更好的性能,主要的原理是,线程调用锁的wait方法,是线程释放锁,其他线程取得锁以后继续操作共享资源,一直到其他线程调用锁的notify方法后,wait方法所在线程被唤醒,继续操作。
第一个线程,主要用于给共享资源添加元素:
第二个线程主要是判断共享资源是否已经达到线程执行的条件。
执行类如下:
执行结果如下:
list add value 0
begin monitor..
list add value 1
list add value 2
list add value 3
list add value 4
got it..5
list add value 5
list add value 6
list add value 7
list add value 8
list add value 9
在线程B调用wait方法后,线程B释放锁,线程A继续运行,一直到线程A调用notify后,线程B在wait方法后面继续执行。
这里需要注意几点:
在线程B调用wait方法之后,被唤醒之前,其他线程如果调用线程B的interrupt 方法,会导致线程B被唤醒,执行wait()后面的方法,同时会抛出异常。
在线程A调用notify方法后,线程A不会立即释放锁,而是会把synchronized方法执行完毕后,才会释放锁。
第一个线程,主要用于给共享资源添加元素:
package com.lenovo.plm.dms.p9; import java.util.List; public class ThreadA extends Thread{ private List<String> list; private Object lock; public ThreadA(List<String> list,Object lock){ this.list = list; this.lock = lock; } @Override public void run() { // TODO Auto-generated method stub super.run(); for(int i = 0;i<10;i++){ synchronized(lock){ System.out.println("list add value " + i); list.add("lizhi"+String.valueOf(i)); if(list.size() == 5){ lock.notify(); } } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
第二个线程主要是判断共享资源是否已经达到线程执行的条件。
package com.lenovo.plm.dms.p9; import java.util.List; public class ThreadB extends Thread{ private List<String> list; private Object lock; public ThreadB(List<String> list,Object lock){ this.list = list; this.lock = lock; } @Override public void run() { // TODO Auto-generated method stub synchronized(lock){ System.out.println("begin monitor.."); try { lock.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("got it.." + list.size()); } } }
执行类如下:
package com.lenovo.plm.dms.p9; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<String>(); Object lock = new Object(); ThreadA threadA = new ThreadA(list,lock); threadA.start(); ThreadB threadB = new ThreadB(list,lock); threadB.start(); } }
执行结果如下:
list add value 0
begin monitor..
list add value 1
list add value 2
list add value 3
list add value 4
got it..5
list add value 5
list add value 6
list add value 7
list add value 8
list add value 9
在线程B调用wait方法后,线程B释放锁,线程A继续运行,一直到线程A调用notify后,线程B在wait方法后面继续执行。
这里需要注意几点:
在线程B调用wait方法之后,被唤醒之前,其他线程如果调用线程B的interrupt 方法,会导致线程B被唤醒,执行wait()后面的方法,同时会抛出异常。
在线程A调用notify方法后,线程A不会立即释放锁,而是会把synchronized方法执行完毕后,才会释放锁。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序