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

t9eec4r0  于 2023-01-29  发布在  Java
关注(0)|答案(8)|浏览(170)

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

92dk7w1h

92dk7w1h1#

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

d8tt03nd2#

创建一个实现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以开始学习。
如果你的方法会被频繁调用,那么可能不值得每次都创建一个新线程,因为这是一个代价高昂的操作。最好使用某种线程池。看看java.util.concurrent包中的FutureCallableExecutor类。

r8xiu3jd

r8xiu3jd3#

在Java8中,您可以通过一行代码来完成此操作。
如果你的方法不带任何参数,你可以使用一个方法引用:

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

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

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

ecfsfe2w4#

如果您使用的是Java 8或更高版本,则可以使用CompletableFuture类中的runAsync方法

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

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

CompletableFuture.supplyAsync(() -> 1);
kse8i1jr

kse8i1jr5#

另一个调用事物(如对话框和消息框,以及为非线程安全方法创建单独的线程)的更快选择是使用Lamba表达式

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

cbjzeqam6#

要在RxJava 2.x中实现这一点,您可以用途:

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

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

xtupzzrd

xtupzzrd7#

以前,我编写了一个简单的实用程序类,它使用JDK5执行器服务并在后台执行特定的进程,由于doWork()通常会有一个void返回值,您可能希望使用这个实用程序类在后台执行它。
请参见this article,我在其中记录了此实用程序。

ehxuflar

ehxuflar8#

在java8中你可以通过创建新线程的方法引用来调用它。

Thread t = new Thread(new YourClassName::doWork);
t.start();

你也可以参考静态方法,在这种情况下你不需要使用new操作符。

相关问题