假设我有一个方法doWork()
。如何从单独的线程(而不是主线程)调用它。
答案 0 :(得分:132)
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
});
t1.start();
或
new Thread(new Runnable() {
@Override
public void run() {
// code goes here.
}
}).start();
或
new Thread(() -> {
// code goes here.
}).start();
或
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
或
Executors.newCachedThreadPool().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
答案 1 :(得分:122)
创建一个实现Runnable
接口的类。将您想要运行的代码放在run()
方法中 - 这是您必须编写的方法,以符合Runnable
接口。在“主”线程中,创建一个新的Thread
类,将构造函数传递给Runnable
的实例,然后在其上调用start()
。 start
告诉JVM创建一个新线程,然后在该新线程中调用run
方法。
public class MyRunnable implements Runnable {
private int var;
public MyRunnable(int var) {
this.var = var;
}
public void run() {
// code in the other thread, can reference "var" variable
}
}
public class MainThreadClass {
public static void main(String args[]) {
MyRunnable myRunnable = new MyRunnable(10);
Thread t = new Thread(myRunnable)
t.start();
}
}
看看Java's concurrency tutorial即可开始使用。
如果要经常调用您的方法,那么每次创建新线程可能都不值得,因为这是一项昂贵的操作。最好使用某种线程池。查看Future
包中的Callable
,Executor
,java.util.concurrent
类。
答案 2 :(得分:49)
在Java 8中,您可以使用一行代码执行此操作。
如果您的方法不接受任何参数,则可以使用方法参考:
new Thread(MyClass::doWork).start();
否则,您可以在lambda表达式中调用该方法:
new Thread(() -> doWork(someParam)).start();
答案 3 :(得分:6)
调用内容的另一个更快的选项(如DialogBoxes和MessageBoxes以及为非线程安全方法创建单独的线程)将使用Lamba Expression
new Thread(() -> {
"code here"
}).start();
答案 4 :(得分:3)
前段时间,我编写了一个简单的实用程序类,它使用JDK5执行程序服务并在后台执行特定的进程。由于doWork()通常具有void返回值,因此您可能希望使用此实用程序类在后台执行它。
请参阅我已记录此实用程序的this article。
答案 5 :(得分:3)
要使用RxJava 2.x实现此目的,您可以使用:
Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();
subscribeOn()
方法指定运行操作的调度程序--RxJava有几个预定义的调度程序,包括Schedulers.io()
,其中有一个用于I / O操作的线程池,以及Schedulers.computation()
适用于CPU密集型操作。
答案 6 :(得分:0)
如果您至少使用Java 8,则可以使用类CompletableFuture中的方法runAsync
CompletableFuture.runAsync(() -> {...});
如果您需要返回结果,请改用supplyAsync
CompletableFuture.supplyAsync(() -> 1);