在下面的代码中,我希望线程 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/