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

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

5 Solutions collect form web for “如何在Java中使用单独的线程调用方法?”

创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(); 
  • 如何检测应用程序何时终止?
  • 如何从ThreadPool.QueueUserWorkItem中捕获exception?
  • Java同步:在帐户对之间primefaces地转移资金?
  • std ::线程调用类的方法
  • PyQt4在线程中等待来自GUI的用户input
  • 线程本地存储为什么这么慢?
  • Pythonsubprocess。从一个线程开启
  • 如何取消SwingWorker的执行?
  • 在超时后中断任务的ExecutorService
  • 如何在Python中使用线程?
  • 带参数的ThreadStart