java - 实现生产者消费者模式

标签 java multithreading concurrency producer-consumer executor

我正在尝试编写一个邮件实用程序,将邮件放入队列中,稍后由消费者线程使用。

我正在尝试实现典型的生产者-消费者模式,但出了点问题。

我刚刚写了一个框架,但框架没有按预期工作。

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/

相关文章:

java - 带有自定义对象数组列表的 Java 中的变量范围问题

c# - 是什么允许 .NET 任务在等待 I/O 完成后继续执行?

node.js - 为什么 node.js 异步模块在使用 async.eachLimit(array, limit, function, callback) 的第一步后停止?

concurrency - 请澄清VHDL中顺序和并发执行的概念

java - 从阻塞方法调用创建 CompletableFuture

java - 将html链接放入java代码中

java - Roller 中的 session 安全违规

java - Spring Boot viewControllerHandlerMapping配置

windows - 如何从一个进程快速切换到另一个进程?

c - OpenMP 中没有加速