我理解多线程的通信应该是无时无刻不在,因为有共享资源存在,因此多个线程同步的操作,本质就是每个线程获取到其他线程操作后的结果,然后进行操作,这就是通信。
因此这里写一个多线程通信的雏形。
第一个线程类主要是给共享资源添加元素。
package com.lenovo.plm.dms.p9;
import java.util.List;
public class ThreadA extends Thread{
private List<String> list;
public ThreadA(List<String> list){
this.list = list;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
for(int i = 0;i<10;i++){
synchronized(list){
System.out.println("list add value " + i);
list.add("lizhi"+String.valueOf(i));
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
第二个线程类,主要是不断的判断这个共享资源的元素是否有5个。如果条件满足了,那么该线程就执行自己的逻辑,这里也就是停止线程。
package com.lenovo.plm.dms.p9;
import java.util.List;
public class ThreadB extends Thread{
private List<String> list;
public ThreadB(List<String> list){
this.list = list;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized(list){
if(list.size() == 5){
System.out.println("Got it.."+list.size());
return;
}
}
}
}
}
主类的代码如下:
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>();
ThreadA threadA = new ThreadA(list);
threadA.start();
ThreadB threadB = new ThreadB(list);
threadB.start();
}
}
运行结果:
list add value 0
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
这里需要留意的是,必须要对list 加锁才行,否则多线程之间不能保证共享资源的可见性,这样第二个线程就不能准确判断条件了。
这种通信方式比较笨拙,第一个线程给共享资源添加元素,第二个线程不间断的判断条件,多数条件其实是不符合要求的,如果可以把这些不符合要求的条件判断省略掉,那么性能会大大的增加。JVM也提供了wait,notify方式更高级的实现线程间的通信。