码上敲享录 > java高并发常见问题 > LinkedTransferQueue实现两个线程之间的数据传递共享,添加和获取的线程实时交替执行

LinkedTransferQueue实现两个线程之间的数据传递共享,添加和获取的线程实时交替执行

上一章章节目录下一章 2019-05-30已有1621人阅读 评论(0)

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


0

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交