问题
假设我有一个方法doWork()。如何从单独的线程(不是主线程)调用它。
#1 热门回答(107 赞)
创建一个实现Runnable接口的类。将你想要运行的代码放在run()方法中 - 这是你必须编写的方法,以符合Runnable接口。在你的"主"线程中,创建一个newThreadclass,传递构造函数的yourRunnable的实例,然后调用它.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.util.concurrent包装中的Future,Callable,Executor类。
#2 热门回答(104 赞)
怎么样 :
Thread t1 = new Thread(new Runnable() {
public void run() {
// code goes here.
}
});
t1.start();
OR
new Thread(new Runnable() {
public void run() {
// code goes here.
}
}).start();
另外一个选择:
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
要么
Executors.newCachedThreadPool().execute(new Runnable() {
@Override
public void run() {
myCustomMethod();
}
});
#3 热门回答(44 赞)
在Java 8中,你可以使用一行代码执行此操作。
如果你的方法不带任何参数,你可以使用方法参考:
new Thread(MyClass::doWork).start();
否则,你可以在lambda表达式中调用该方法:
new Thread(() -> doWork(someParam)).start();