假设我有一个方法doWork()
。我如何从一个单独的线程(不是主线程)中调用它。
假设我有一个方法doWork()
。我如何从一个单独的线程(不是主线程)中调用它。
Answers:
创建一个实现该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的并发教程以开始。
如果您的方法将被频繁调用,那么每次创建一个新线程可能都不值得,因为这是一项昂贵的操作。最好使用某种类型的线程池。看一看Future
,Callable
,Executor
类的java.util.concurrent
包。
run()
方法不带参数,因此您无法在其中传递变量。我建议您在构造函数中传递它-我将编辑答案以表明这一点。
new Thread() { public void run() {myMethod();}}.start();
这是最短的吗?
Runnable
它是扩展的类Runnable
。而且因为这样做,我有了自己的构造函数,该构造函数将状态传递到实例化的对象中。
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();
}
});
run()
?
在Java 8中,您可以使用一行代码来完成此操作。
如果您的方法不带任何参数,则可以使用方法参考:
new Thread(MyClass::doWork).start();
否则,您可以在lambda表达式中调用该方法:
new Thread(() -> doWork(someParam)).start();
->
意思?
Celery task queue
为异步的东西
调用事物的另一个更快的选择(例如DialogBoxes和MessageBoxes以及为非线程安全的方法创建单独的线程)是使用Lamba Expression
new Thread(() -> {
"code here"
}).start();
如果您至少使用Java 8,则可以使用runAsync
类CompletableFuture中的方法
CompletableFuture.runAsync(() -> {...});
如果您需要返回结果,请supplyAsync
改用
CompletableFuture.supplyAsync(() -> 1);