多线程之间通信
如何进行多线程之间的通信?
有一个原始笨方法就是在线程A中写一个while循环,去判断某个公共字段flag是否符合条件,符合条件就往下执行。在线程B中特定方法执行完之后修改flag为true。但是这样线程A一直监控公共字段,会使内存占用过高。
另一种方法就是使用线程的wait,notify来进行控制。在线程A执行前判断flag是否符合条件,不符合就调用wait方法麻将线程A置为等待状态,释放锁。线程B满足条件时,调用notify方法,唤醒线程A。
public class ThreadA extends Thread{
private Object lock;
public ThreadA(Object lock) {
super();
this.lock = lock;
}
@Override
public void run() {
try {
synchronized (lock){
if(SynchronizedResource.getListSize()!=5){
System.out.println("池子还没有满,需要继续等待生产"+System.currentTimeMillis());
lock.wait();
System.out.println("池子已经填满,等待完成,执行后续操作"+System.currentTimeMillis());
}
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
public class ThreadB extends Thread{
private Object lock;
public ThreadB(Object lock) {
super();
this.lock = lock;
}
@Override
public void run() {
try {
synchronized (lock){
for(int i=1;i<11;i++){
SynchronizedResource.putList(""+i);
System.out.println("已经添加了:"+i+"个数据");
if(SynchronizedResource.getListSize()==5){
lock.notify();
System.out.println("池子已经有5条数据,通知消费者消费"+System.currentTimeMillis());
}
Thread.sleep(2000);
}
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
public class TestMain {
public static void main(String[] args) {
try {
Object lock = new Object();
ThreadA threadA = new ThreadA(lock);
threadA.start();
Thread.sleep(50);
ThreadB threadB = new ThreadB(lock);
threadB.start();
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
控制台输出
文章参考:https://www.cnblogs.com/hapjin/p/5492619.html