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

时间:2010-08-15 22:31:00

标签: java multithreading

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

7 个答案:

答案 0 :(得分:132)

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

答案 1 :(得分:122)

创建一个实现Runnable接口的类。将您想要运行的代码放在run()方法中 - 这是您必须编写的方法,以符合Runnable接口。在“主”线程中,创建一个新的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's concurrency tutorial即可开始使用。

如果要经常调用您的方法,那么每次创建新线程可能都不值得,因为这是一项昂贵的操作。最好使用某种线程池。查看Future包中的CallableExecutorjava.util.concurrent类。

答案 2 :(得分:49)

在Java 8中,您可以使用一行代码执行此操作。

如果您的方法不接受任何参数,则可以使用方法参考:

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

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

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

答案 3 :(得分:6)

调用内容的另一个更快的选项(如DialogBoxes和MessageBoxes以及为非线程安全方法创建单独的线程)将使用Lamba Expression

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

答案 4 :(得分:3)

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

请参阅我已记录此实用程序的this article

答案 5 :(得分:3)

要使用RxJava 2.x实现此目的,您可以使用:

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

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

答案 6 :(得分:0)

如果您至少使用Java 8,则可以使用类CompletableFuture中的方法runAsync

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

如果您需要返回结果,请改用supplyAsync

CompletableFuture.supplyAsync(() -> 1);