在 Java 中如何使用单独的线程调用方法?

假设我有一个方法 doWork()。我如何从一个单独的线程(而不是主线程)调用它。

346953 次浏览

创建一个实现 Runnable接口的类。将要运行的代码放在 run()方法中——这是为遵从 Runnable接口而必须编写的方法。在“ main”线程中,创建一个新的 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 的并发教程开始吧。

如果您的方法将被频繁调用,那么可能不值得每次都创建一个新线程,因为这是一个昂贵的操作。最好使用某种类型的线程池。查看 java.util.concurrent包中的 FutureCallableExecutor类。

不久前,我编写了一个简单的实用程序类,它使用 JDK5执行器服务并在后台执行特定的进程。因为 doWork ()通常会有一个 void 返回值,所以您可能希望使用这个实用工具类在后台执行它。

请参阅 这篇文章,我在其中记录了这个实用程序。

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();
}
});

在 Java8中,只需要一行代码就可以做到这一点。

如果您的方法没有任何参数,您可以使用方法引用:

new Thread(MyClass::doWork).start();

否则,可以在 lambda 表达式中调用该方法:

new Thread(() -> doWork(someParam)).start();

另一个更快的调用方法(比如 DialogBoxes 和 MessageBoxes,以及为非线程安全的方法创建单独的线程)是使用 Lamba Expression

  new Thread(() -> {
"code here"
}).start();

要使用 RxJava 2.x 实现这一点,可以使用:

Completable.fromAction(this::dowork).subscribeOn(Schedulers.io().subscribe();

subscribeOn()方法指定在哪个调度程序上运行操作-RxJava 有几个预定义的调度程序,包括 Schedulers.io(),它有一个用于 I/O 操作的线程池,以及 Schedulers.computation(),它用于 CPU 密集型操作。

如果您至少使用 Java8,那么可以使用类 完整的未来中的方法 runAsync

CompletableFuture.runAsync(() -> {...});

如果需要返回结果,则使用 supplyAsync

CompletableFuture.supplyAsync(() -> 1);