如何在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
包中的Future
, Callable
, Executor
类。
怎么样 :
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();