有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java启动工作线程并加入它们的正确方法是什么?

Java的一个教程给出了这个关于线程的例子。下面的代码片段来自https://docs.oracle.com/javase/tutorial/essential/concurrency/simple.html。以下是我要问的部分(有一些小的修改):

Thread t = new Thread(new MessageLoop());
t.start();

while (t.isAlive()) {
    t.join();
}

主要问题是:当t.isAlive()在线程实际启动之前返回false时会发生什么?根据我进行的一些测试:

Thread t = new Thread(new Whatever());
t.start();
System.out.println(t.isAlive()+" "+t.getState());

有可能t.getState()是新的,而t.isAlive()是错误的。上面的while循环将永远不会加入我的工作线程,因为isAlive将返回false(即使工作线程甚至没有启动)。除了第一段代码中显示的方法外,还有更好的方法连接工作线程吗?我是不是应该检查一下它的状态以及它是否还活着?也许是这样的:

while(t.isAlive() || t.getState()==Thread.State.NEW){ ... }

共 (1) 个答案

  1. # 1 楼答案

    有效的Java建议不要直接使用Thread,而是使用java.util.concurrent包中定义的Executor框架。在这个框架中,首先从^{}中的一个静态工厂方法获取ExecutorService,用对submit()的调用替换new Threadt.start(),然后用^{}或其他提供的同步器类在线程之间进行协调,或者(在简单的情况下)调用submit()返回的Future上的get()

    请注意ExecutorService一旦创建,将永远运行,并且如果忽略对其调用shutdown(),可能会阻止程序终止。它们被设计为可重用的,将许多不同的任务提交给单个任务(这可能会在内部将它们分割到许多不同的线程中),并将继续运行,直到您告诉它们不再进行重用为止