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

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

创build一个实现Runnable接口的类。 把你想运行的代码放在run()方法中 – 这就是你必须写的遵循Runnable接口的方法。 在你的“主”线程中,创build一个新的Thread类,传递构造函数一个Runnable的实例,然后调用start()start告诉JVM做魔法来创build一个新线程,然后在新线程中调用你的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的并发教程开始。

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

怎么样 :

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

另一种select:

 Executors.newSingleThreadExecutor().execute(new Runnable() { @Override public void run() { myCustomMethod(); } }); 

要么

 Executors.newCachedThreadPool().execute(new Runnable() { @Override public void run() { myCustomMethod(); } }); 

在Java 8中,你可以用一行代码来完成。

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

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

否则,您可以在lambdaexpression式中调用该方法:

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

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

看到这篇文章 ,我已经logging了这个工具。

另一个更快的选项(比如DialogBoxes和MessageBoxes,为非线程安全的方法创build单独的线程)可以使用Lambaexpression式

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