LinkedTransferQueue实现两个线程之间的数据传递共享,添加和获取实时交替执行
解决方法:
实现线程threadA通过tryTransfer或者transfer方法存放数据到队列LinkedTransferQueue,如果没有其它线程从队列中获取数据,那threadA不会进入阻塞状态,可以继续添加数据到LinkedTransferQueue,这点与SynchronousQueue队列不同。当有线程在等待获取数据,添加数据的时候会马上通知这个等待的线程获取数据。
1.测试类
import java.util.concurrent.LinkedTransferQueue;
public class Test{
public static void main(String[] args) {
try {
LinkedTransferQueue s=new LinkedTransferQueue();
//往LinkedTransferQueue队列获取数据的线程
TestB testB= new TestB(s);
Thread threadB = new Thread(testB);
threadB.start();
Thread.sleep(1000);
//往LinkedTransferQueue队列添加数据的线程
TestA testA = new TestA(s);
Thread threadA = new Thread(testA);
threadA.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.线程threadA,往队列里添加数据
import java.util.concurrent.LinkedTransferQueue;
public class TestA implements Runnable{
public LinkedTransferQueue s=new LinkedTransferQueue();
public TestA(LinkedTransferQueue s) {
super();
this.s = s;
}
@Override
public void run() {
try {
System.out.println("step1");
System.out.println("数据1已存入SynchronousQueue队列");
s.tryTransfer("共享数据1");
System.out.println("数据2已存入SynchronousQueue队列");
s.tryTransfer("共享数据2");
System.out.println("step2");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.线程threadB,从队列里获取数据
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.SynchronousQueue;
public class TestB implements Runnable{
public LinkedTransferQueue s=new LinkedTransferQueue();
public TestB(LinkedTransferQueue s) {
super();
this.s = s;
}
@Override
public void run() {
try {
System.out.println("step3");
System.out.println("获取SynchronousQueue队列的值1:"+s.take());;
System.out.println("step4");
System.out.println("获取SynchronousQueue队列的值2:"+s.take());
System.out.println("step5");
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.结果,添加数据和获取的线程交替执行
step3
step1
数据1已存入SynchronousQueue队列
获取SynchronousQueue队列的值1:共享数据1
step4
数据2已存入SynchronousQueue队列
step2
获取SynchronousQueue队列的值2:共享数据2
step5