Java线程同步阻塞队列LinkedTransferQueue
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TimeUnit;
/**
* Java线程同步阻塞队列LinkedTransferQueue
*
* Java LinkedTransferQueue是SynchronousQueue的升级。
* LinkedTransferQueue是一个链表结构的无界阻塞TransferQueue队列。
* 当消费者取数据时,如果队列非空,则直接取出数据(队列变空)。
* 当消费者取数据时,如果队列为空,那么就生成一个节点(节点为null)入队,然后消费者线程被等待在这个节点上,等待生产者线程把数据制造出来。
*/
public class Main {
private LinkedTransferQueue<String> mQueue;
public static void main(String[] args) {
try {
new Main().test();
} catch (Exception e) {
e.printStackTrace();
}
}
private void test() {
mQueue = new LinkedTransferQueue();
//生产者和消费者在线程并发的竞争环境下对队列数据进行读写。
consumer();
producer();
}
/**
* 数据生产者。
*/
private void producer() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
//生成一个数据元素放到队列中。
try {
mQueue.transfer(System.currentTimeMillis() + ""); //.add()或者addAll()
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
/**
* 数据消费者。
*/
private void consumer() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
//消费,取走一个数据元素。
String s = mQueue.take();
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
}