【发布时间】:2012-09-23 10:23:28
【问题描述】:
我想从我的主 java 程序中生成一个 Java 线程,并且该线程应该单独执行而不干扰主程序。应该是这样的:
- 用户启动的主程序
- 做一些业务工作,应该创建一个可以处理后台进程的新线程
- 一旦创建线程,主程序不应等到生成的线程完成。事实上它应该是无缝的..
【问题讨论】:
-
Threads in Java 的可能重复项
标签: java multithreading
我想从我的主 java 程序中生成一个 Java 线程,并且该线程应该单独执行而不干扰主程序。应该是这样的:
【问题讨论】:
标签: java multithreading
一种直接的方法是自己手动生成线程:
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
runYourBackgroundTaskHere();
}
};
new Thread(r).start();
//this line will execute immediately, not waiting for your task to complete
}
或者,如果您需要生成多个线程或需要重复执行,您可以使用更高级别的并发 API 和执行器服务:
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
runYourBackgroundTaskHere();
}
};
ExecutorService executor = Executors.newCachedThreadPool();
executor.submit(r);
// this line will execute immediately, not waiting for your task to complete
executor.shutDown(); // tell executor no more work is coming
// this line will also execute without waiting for the task to finish
}
【讨论】:
imports 会很酷,特别是如果所述答案甚至包括一个主要的并且应该是一段独立的代码,所以我不必寻找每次都为他们...
使用 Lambda 更简单! (Java 8) 是的,这确实有效,我很惊讶没有人提到它。
new Thread(() -> {
//run background code here
}).start();
【讨论】:
这是使用匿名内部类创建线程的另一种方式。
public class AnonThread {
public static void main(String[] args) {
System.out.println("Main thread");
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Inner Thread");
}
}).start();
}
}
【讨论】:
如果你喜欢用 Java 8 的方式来做,你可以像这样简单:
public class Java8Thread {
public static void main(String[] args) {
System.out.println("Main thread");
new Thread(this::myBackgroundTask).start();
}
private void myBackgroundTask() {
System.out.println("Inner Thread");
}
}
【讨论】:
new Thread(this::myBackgroundTask).start(); this 在main(静态)方法中? Java 8 的方式应该是:方法调用: new Thread(new Java8Thread().myBackgroundTask()).start(); 方法定义: private Runnable myBackgroundTask() { return ()->{ //background task }; }