【多生产者多消费者实现】1.Runnable用于实现线程任务 2.BlockingQueue用于线程数据交换

1)产品

package juc.blockingqueue;

public class Product {
    public Product() {

    }

    @Override
    public String toString() {
        return "Product$" + this.hashCode();
    }
}

2)生产者

package juc.blockingqueue;

import java.util.concurrent.BlockingQueue;

public class Producer implements Runnable {
    private BlockingQueue<Product> queue;

    public Producer(BlockingQueue<Product> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        Product prod = null;
        String tName = Thread.currentThread().getName();
        while (!Thread.interrupted()) {
            prod = new Product();
            System.out.printf("[%s] produce %s \n", tName, prod);

            try {
                queue.put(prod);
                Thread.sleep(250);
            } catch (InterruptedException e) {
                return;
            }
        }
    }
}

3)消费者

package juc.blockingqueue;

import java.util.concurrent.BlockingQueue;

public class Consumer implements Runnable {
    private BlockingQueue<Product> queue;

    public Consumer(BlockingQueue<Product> queue) {
        this.queue = queue;
    }


    @Override
    public void run() {
        Product prod = null;

        String tName = Thread.currentThread().getName();

        while (!Thread.interrupted()) {
            try {
                prod = queue.take();
                System.out.printf("[%s] consume %s \n", tName, prod);
            } catch (InterruptedException e) {
                return;
            }
        }
    }
}

4)测试类

package juc.blockingqueue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

public class BlockingQueueTest {
    public static void main(String[] args) {
        BlockingQueue<Product> queue = new LinkedBlockingQueue<>(10);

        Thread p1 = new Thread(new Producer(queue), "Producer-1");
        Thread p2 = new Thread(new Producer(queue), "Producer-2");
        Thread p3 = new Thread(new Producer(queue), "Producer-3");


        Thread c1 = new Thread(new Consumer(queue), "Consumer-1");
        Thread c2 = new Thread(new Consumer(queue), "Consumer-2");
        Thread c3 = new Thread(new Consumer(queue), "Consumer-3");

        p1.start();
        p2.start();
        p3.start();

        c1.start();
        c2.start();
        c3.start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        p1.interrupt();
        p2.interrupt();
        p3.interrupt();

        c1.interrupt();
        c2.interrupt();
        c3.interrupt();

    }
}

[Producer-1] produce Product$1017826111 
[Producer-3] produce Product$388481805 
[Producer-2] produce Product$733316467 
[Consumer-2] consume Product$388481805 
[Consumer-1] consume Product$1017826111 
[Consumer-3] consume Product$733316467 
[Producer-1] produce Product$725109067 
[Producer-3] produce Product$434122649 
[Producer-2] produce Product$628256373 
[Consumer-2] consume Product$725109067 
[Consumer-3] consume Product$628256373 
[Consumer-1] consume Product$434122649 
[Producer-2] produce Product$558755331 
[Producer-3] produce Product$501196925 
[Producer-1] produce Product$361717370 
[Consumer-3] consume Product$501196925 
[Consumer-2] consume Product$558755331 
[Consumer-1] consume Product$361717370 
[Producer-2] produce Product$1682924622 
[Producer-1] produce Product$1349900923 
[Producer-3] produce Product$1490888098 
[Consumer-3] consume Product$1682924622 
[Consumer-3] consume Product$1490888098 
[Consumer-2] consume Product$1349900923 

总结:

所有线程共享一个BlockingQueue,多个生产者往里面提交消息,相当于消息总线。

而多个消费者不断从里面取消息,从而进行多线程消费。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Java中的BlockingQueue实现消费者生产者问题。BlockingQueue是一个线程安全的队列,它提供了put()和take()方法,分别用于生产和消费。当队列为空时,take()方法会阻塞线程,直到队列中有元素;当队列满时,put()方法会阻塞线程,直到队列中有空闲位置。 以下是一个简单的示例代码: import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class ProducerConsumerExample { private static final int QUEUE_CAPACITY = 10; private static final int NUM_PRODUCERS = 2; private static final int NUM_CONSUMERS = 3; public static void main(String[] args) { BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(QUEUE_CAPACITY); for (int i = 0; i < NUM_PRODUCERS; i++) { new Thread(new Producer(queue)).start(); } for (int i = 0; i < NUM_CONSUMERS; i++) { new Thread(new Consumer(queue)).start(); } } static class Producer implements Runnable { private final BlockingQueue<Integer> queue; public Producer(BlockingQueue<Integer> queue) { this.queue = queue; } @Override public void run() { try { for (int i = 0; i < 10; i++) { queue.put(i); System.out.println("Produced: " + i); Thread.sleep(1000); } } catch (InterruptedException e) { e.printStackTrace(); } } } static class Consumer implements Runnable { private final BlockingQueue<Integer> queue; public Consumer(BlockingQueue<Integer> queue) { this.queue = queue; } @Override public void run() { try { while (true) { Integer value = queue.take(); System.out.println("Consumed: " + value); Thread.sleep(2000); } } catch (InterruptedException e) { e.printStackTrace(); } } } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值