public class Consumer implements Runnable{
private final TransferQueue<String> queue;
public Consumer(TransferQueue<String> queue) {
this.queue = queue;
}
@Override
public void run() {
try {
System.out.println("Consumer " + Thread.currentThread().getName() + queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
生产者类
public class Producer implements Runnable {
private final TransferQueue<String> queue;
public Producer(TransferQueue<String> queue) {
this.queue = queue;
}
private String produce() {
return "随机数字" + (new Random().nextInt(100));
}
@Override
public void run() {
try {
while (true) {
if (queue.hasWaitingConsumer()) {
queue.transfer(produce());
}
TimeUnit.SECONDS.sleep(2);
}
} catch (InterruptedException e){
}
}
}
接下来看下下面两段测试代码:
1、在main方法中测试,测试结果是非守护进程不会退出,消费者线程都能拿到数据,消费者线程拿到数据后就直接退出了,最后就会剩下生产者线程独自运行。
/**
**一段生产者消费者demo
***/
public static void main(String[] args) {
TransferQueue<String> queue = new LinkedTransferQueue<String>();
Thread producer = new Thread(new Producer(queue));
//producer.setDaemon(true);
producer.start();
for (int i = 0; i < 10; i++) {
Thread consumer = new Thread(new Consumer(queue));
//consumer.setDaemon(true);
consumer.start();
try {
//防止进程提前结束
Thread.sleep(1000L);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
2、在junit单元测试中测试上述代码:
@Test
public void transferQueue() {
println(Thread.currentThread().isDaemon());
TransferQueue queue = new LinkedTransferQueue();
Thread producer = new Thread(new Producer(queue));
producer.setDaemon(true);
println(producer.isDaemon());
//producer.setDaemon(true);
producer.start();
for (int i = 0; i < 10; i++) {
Thread consumer = new Thread(new Consumer(queue));
//consumer.setDaemon(true);
consumer.start();
try {
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
…(img-kL0dygAo-1719249668395)]
[外链图片转存中…(img-i5KcaPFD-1719249668396)]
[外链图片转存中…(img-rDXAo8MS-1719249668396)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!