我正在尝试编写一个邮件实用程序,将邮件放入队列中,稍后由消费者线程使用。
我正在尝试实现典型的生产者-消费者模式,但出了点问题。
我刚刚写了一个框架,但框架没有按预期工作。
MailProducer.java
public class MailProducer implements Callable<Void>
{
@Override
public Void call() throws Exception
{
System.out.println("inside mail Producer");
System.out.println("Thread executing = " +
Thread.currentThread().getName());
return null;
}
}
MailConsumer.java
public class MailConsumer implements Callable<Void>
{
@Override
public Void call() throws Exception
{
System.out.println("inside mail consumer");
System.out.println("Thread executing = " +
Thread.currentThread().getName());
return null;
}
}
最后是执行者
MailExecutor.java
public class MailExecutor
{
private static final int NTHREADS = 25;
private static final ExecutorService exec =
Executors.newFixedThreadPool(NTHREADS);
public static void main(String[] args)
{
exec.submit(new MailConsumer());
exec.submit(new MailProducer());
System.out.println("inside main");
}
}
现在,当我运行该程序时,我希望它在生产者和消费者之间来回传递,以继续打印各自类中编写的内容。但是相反,程序在打印以下行后挂起/不执行任何操作。出了什么问题?我错过了什么吗?
输出 ...(输出不是我预期的。出了什么问题?)
inside mail consumer
inside main
Thread executing = pool-1-thread-1
inside mail Producer
Thread executing = pool-1-thread-2
最佳答案
您缺少共享队列。没有队列,您将一无所有。
生产者将工作放入队列。消费者从队列中取出工作。使用 BlockingQueue
, 谁的 put()
和 take()
方法是阻塞调用。在单独的线程中运行生产者和消费者允许他们在调用这些方法时安全地阻塞。
生产者和消费者都不需要是Callable
; Runnable
就可以了。使用Executor
将它们结合在一起是个好主意。
关于java - 实现生产者消费者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7874861/