Java,不要等待线程完成

Jed*_*Pie 9 java multithreading

我需要找到一种从静态调用中分离线程的方法,而不是等待线程完成.基本上,一种"即发即忘"的方法.有人能为我提供一个如何实现这一目标的简单例子吗?

Pau*_*ams 27

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

// JDK 8
new Thread(() -> methodYouWantToRun()).start();
Run Code Online (Sandbox Code Playgroud)


Ada*_*icz 9

如果它是一个长期存在的线程,它与你的应用程序本身具有相似的生命周期,并且将花费大量时间等待其他线程:

new Thread(new yourLongRunningProcessThatImplementsRunnable()).start();
Run Code Online (Sandbox Code Playgroud)

如果它是一个短命的,受CPU限制的任务:

ExecutorService es = Executors.newFixedThreadPool(Runtime.availableProcessors());
es.submit(new yourTaskThatImplementsRunnable());
Run Code Online (Sandbox Code Playgroud)

虽然,在大多数情况下,你会提交一些相同的任务ExecutorService.

看到:


Ste*_* B. 7

public static void foo() {
    new Thread() {
        public void run() {
                     //do something here....
        }
    }.start();
}
Run Code Online (Sandbox Code Playgroud)

  • 但是如果任务相对简单,请使用Thread的Runnable构造函数(即新的Thread(new Runnable(){public void run(){...}})),因为这样你就不会扩展复杂的class,但实现了一个接口,在字节码中应该更简单,并且你不会与Thread中的方法有任何名称冲突. (2认同)

Nei*_*fey 5

根据任务的性质,可能会有不同的方式:

(1)正如许多人所提到的,偶然任务的一种常见方法是简单地构造一个线程并调用它的start()方法.

(2)请记住,如果后台线程没有停止,那么默认情况下它会阻止程序在其他线程完成时关闭.因此,可能希望在线程上调用setDaemon(true),以便它不具有此行为.(另一方面,在基于GUI的应用程序中,您通常最终只是调用System.exit(),理想情况下,您可以通过一种干净的关闭方式来运行长时间运行的任务.)

(3)如果你经常有短暂的任务 "发射并忘记",那么考虑使用Java 5以后的Executors框架.