多线程之间通信

如何进行多线程之间的通信?

有一个原始笨方法就是在线程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




posted on 2022-04-06 16:33  芒果汪  阅读(104)  评论(0)    收藏  举报