java - 我可以将一个 Runnable 用于两个线程,以便一个生成,一个消耗吗?

标签 java multithreading producer-consumer

在下面的代码中,我希望线程 t1 执行 Runnable 的生成,线程 t2 执行 Runnable 的消耗。这行得通吗?

class Processor implements Runnable {
    @override
    run(){
        produce();
        consume();
    }
    void produce(){
        // code to produce, synchronize
    }
    void consume(){
        // code to consume, synchronize
    }
}

Class App {
    public static void main(String[] args){
        Processor p = new Processor()
        Thread t1 = new Thread(p);
        t1.start();
        Thread t2 = new Thread(p); 
        t2.start();
    }
}

最佳答案

In the code below I want Thread t1 to execute produce of Runnable and Thread t2 to execute consume of Runnable.

第一个答案是您很可能不想这样做。您应该有一个生产者类和一个消费者类。如果他们需要共享数据那么没问题,但出于模块化目的,您应该将生产者和消费者代码分开。例如,生产者和消费者代码可以共享一个 BlockingQueue,该队列将被传递到两个类中并用于它们交换工作。

正如您当前编写的代码一样,每个线程显然只会调用product(),然后调用consume()。我假设代码是作为示例编写的。

如果您确实想将生产者和消费者代码组合在同一个类中,您可以传递某种 boolean 值或其他选择器来告诉线程生产或消费。

例如:

 public class ProducerConsumerRunnable implements Runnable {
      private final Processor processor;
      private final boolean consume;
      public ProducerConsumerRunnable(Processor processor, boolean consume) {
          this.processor = processor;
          this.consume = consume;
      }
      public void run() {
          if (consume) {
              processor.consume()
          } else {
              processor.produce()
          }
      }
 }

那么你就可以像这样开始你的线程:

Processor p = new Processor()
Thread producerThread = new Thread(new ProducerConsumerRunnable(p, false));
producerThread.start();
Thread consumerThread = new Thread(new ProducerConsumerRunnable(p, true));
consumerThread.start();

编辑:

当您应该调用 thread.start() 时,您的代码最初正在调用 thread.run()。调用 run() 只会在前台线程中运行可运行对象,而 start() 实际上在后台 fork 一个线程,然后调用 run。

关于java - 我可以将一个 Runnable 用于两个线程,以便一个生成,一个消耗吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17284583/

相关文章:

java - 如何使用java连接到远程计算机上的Mysql DB。 DB计算机所在的网络上有许多具有相同公共(public)IP的计算机吗?

c++ - 在 mingw 中执行时禁用线程

c++ - 丢失唤醒 : What if the producer acquires the mutex first?

c# - SerialPort 是否在其自己的线程上接收数据?

java - RabbitMQ:快速生产者和慢消费者

java - 局部变量同步

java - 属性 : system vs. 部署描述符与属性文件的优先级

java - java中的线程生产者消费者

java - Kafka突然重置消费者Offset

java - 在apache cxf中,我如何知道SOAP请求消息是gzip压缩的?