【问题标题】:Can not start executor after another thread [duplicate]在另一个线程之后无法启动执行程序[重复]
【发布时间】:2018-02-22 14:36:43
【问题描述】:

当我在下面运行代码时,生产者 run() 方法启动并将随机数放入作业队列,但消费者 run() 方法从不运行。这里的主要问题是什么?

这里是主类;

public static LinkedBlockingQueue<Integer> jobs = new LinkedBlockingQueue<>();

public static void main(){

    MessageProducer producer = new MessageProducer(jobs);
    Thread producerThread = new Thread(producer);
    producerThread.run();

    MessageConsumer consumer = new MessageConsumer(jobs);
    Executor executor = Executors.newFixedThreadPool(3);
    executor.execute(consumer);

}

制片人;

public class MessageProducer implements Runnable {

    public LinkedBlockingQueue<Integer> jobs;

    public MessageProducer(LinkedBlockingQueue<Integer> jobs){
        this.jobs = jobs;
    }

    @Override
    public void run() {
        while(true) {
            try {
                jobs.put((int) (Math.random() * 10));
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

消费者;

public class MessageConsumer implements Runnable{

    public LinkedBlockingQueue<Integer> jobs;

    public MessageConsumer(LinkedBlockingQueue<Integer> jobs) {
        this.jobs = jobs;
    }


    @Override
    public void run() {
        while(true) {
            System.out.println("Executing " + jobs.poll());
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

【问题讨论】:

  • 尝试 producerThread.start() 而不是 producerThread.run()
  • @yannickott 正是我错过了那个。

标签: java multithreading


【解决方案1】:

不要调用Thread.run()。它不会启动线程。它调用 run() 方法,在您的情况下是一个无限循环。
所以 JVM 一直停留在永远不会返回的 producerThread.run(); 上。

而是调用Thread.start(),它将负责调用run() 方法。

Thread.start() javadoc 确实表明:

使该线程开始执行; Java 虚拟机调用 该线程的run方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多