假设我有一个方法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);