Producer Consumer Multithreading Java 中的终止



我正在做一些多线程和Java并发功能的练习。我有 1 个生产者和 4 个消费者。现在我的问题是:当我确定生产者已经在 BlockingQueue 中完成生产时,还有其他更聪明的方法可以阻止消费者吗?现在我在队列中使用 -1 整数,但看起来非常基本!!谢谢

public class Exercise {
static class Producer implements Runnable {
    int counter=0;
    private BlockingQueue<Integer> queue;
    Producer(BlockingQueue<Integer> q) { 
        queue = q;
    }
    public void run() {
        try {
            while (counter<100000000) {
                queue.put(produce());
            }
            queue.put(new Integer(-1));
            queue.put(new Integer(-1));
            queue.put(new Integer(-1));
            queue.put(new Integer(-1));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    Integer produce() {
        counter++;
        return new Integer(counter);
    }
}
static class Consumer implements Runnable {
    private final BlockingQueue<Integer> queue;
    private String name;
    private long sum;
    Consumer(BlockingQueue<Integer> q, String name) { 
        queue = q; 
        this.name=name;
        sum=0;
    }
    public void run() {
        try {
            int x=0;
            while (x>=0) {
                x=queue.take();
                if(x!=-1)sum+=x;
            }
            System.out.println(sum+" of "+ name);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) {
    ExecutorService exec = Executors.newFixedThreadPool(6);
    BlockingQueue<Integer> q =new LinkedTransferQueue<Integer>();
    Producer p=new Producer(q);    
    Consumer c1 = new Consumer(q,"consumer1");
    Consumer c2 = new Consumer(q,"consumer2");
    Consumer c3 = new Consumer(q,"consumer3");
    Consumer c4 = new Consumer(q,"consumer4");
    exec.submit(p);
    exec.submit(c1);
    exec.execute(c2);
    exec.submit(c3);
    exec.execute(c4);
    exec.shutdown();
}

}

您可以使用毒丸,但是使用这种毒丸的更有力方法是不要将其从队列中删除(或者如果您这样做,请将其放回原处) 这种生产者不需要知道你有多少消费者。

顺便说一句,我会避免使用明确的拳击,因为它更冗长、更慢。

而不是

queue.put(new Integer(-1));

你可以写

queue.put(-1);

甚至更好

static final int POISON_PILL = -1;
// on the producer
queue.put(POISON_PILL);
// on the consumer
while ((x = queue.take()) != POISON_PILL) {
    sum += x;
queue.put(POISON_PILL);

相关内容

  • 没有找到相关文章

最新更新