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

Lou*_*hys 110 java multithreading

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

MAN*_*ANN 152

Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
        // code goes here.
    }
});  
t1.start();
Run Code Online (Sandbox Code Playgroud)

要么

new Thread(new Runnable() {
     @Override
     public void run() {
          // code goes here.
     }
}).start();
Run Code Online (Sandbox Code Playgroud)

要么

new Thread(() -> {
    // code goes here.
}).start();
Run Code Online (Sandbox Code Playgroud)

要么

Executors.newSingleThreadExecutor().execute(new Runnable() {
    @Override
    public void run() {
        myCustomMethod();
    }
});
Run Code Online (Sandbox Code Playgroud)

要么

Executors.newCachedThreadPool().execute(new Runnable() {
    @Override
    public void run() {
        myCustomMethod();
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 我们是否需要显式终止线程?不显式终止线程是否有造成内存泄漏的风险?或者线程是否在使用“run()”完成后终止? (4认同)
  • 在 Java 8 及更高版本中,我们可以用 `() -> myCustomMethod()` 替换 `new Runnable() {...}` 冗长的内容 (2认同)

Noe*_*l M 129

创建一个实现该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();
    }    
}
Run Code Online (Sandbox Code Playgroud)

快来看看Java的并发教程吧.

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

  • `run()`方法不带参数,所以你不能在那里传递一个变量.我建议你在构造函数中传递它 - 我将编辑我的答案以显示它. (8认同)
  • MANN的答案使用了`Runnable`的匿名实现 - 我的是一个扩展`Runnable`的类.因为我已经这样做了,我有自己的构造函数,它将状态传递给实例化对象. (2认同)

Aar*_*ohn 53

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

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

new Thread(MyClass::doWork).start();
Run Code Online (Sandbox Code Playgroud)

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

new Thread(() -> doWork(someParam)).start();
Run Code Online (Sandbox Code Playgroud)

  • 这是用于创建 lambda 表达式的语法。请查看以下链接以了解更多信息:[Java 中的“->”有什么作用?](http://stackoverflow.com/a/20771467/1852614) 和 [Java™ 教程 - Lambda 表达式](http://stackoverflow.com/a/20771467/1852614) ://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html) (2认同)

k13*_*13i 9

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

CompletableFuture.runAsync(() -> {...});
Run Code Online (Sandbox Code Playgroud)

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

CompletableFuture.supplyAsync(() -> 1);
Run Code Online (Sandbox Code Playgroud)


Roh*_*ant 7

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

  new Thread(() -> {
                      "code here"
            }).start();
Run Code Online (Sandbox Code Playgroud)