Ati*_*ain 1 java multithreading
ThreadWorker 当我使用方法引用在Thread的构造函数中创建新对象或传递Lambda以创建新对象时,不执行。
但是,当我ThreadWorker单独创建对象并将其传递给Thread类时,它可以正常工作。
public class RunnableImpl {
public static void main(String[] args) throws InterruptedException {
ThreadWorker th= new ThreadWorker();
Thread t1 = new Thread(th);
t1.start();
t1.join();
System.out.println("Main method terminated");
}
}
class ThreadWorker implements Runnable {
@Override
public void run() {
int[] arr = { 1, 4, 8, 9, 1, 0, 4, 5, 4 };
System.out.println(Arrays.stream(arr).sum());
}
}
Run Code Online (Sandbox Code Playgroud)
例如,如果我使用lambda:
Thread t1 = new Thread(ThreadWorker :: new);
Run Code Online (Sandbox Code Playgroud)
要么
Thread t1 = new Thread(() ->new ThreadWorker());
Run Code Online (Sandbox Code Playgroud)
则没有输出,但是如果我ThreadWorker单独创建对象,则程序运行正常。
有人可以让我知道,怎么可能?
都
new Thread(() -> new ThreadWorker());
Run Code Online (Sandbox Code Playgroud)
和
new Thread(ThreadWorker::new);
Run Code Online (Sandbox Code Playgroud)
创建Thread其Runnable实例的run()方法仅创建一个ThreadWorker实例,而对其不执行任何操作。的run()方法ThreadWorker未执行。
它们等效于传递以下匿名类实例:
Thread t = new Thread(new Runnable() {
public void run() {
new ThreadWorker ();
}
});
Run Code Online (Sandbox Code Playgroud)
如果要使用lambda表达式,则需要:
new Thread(() -> new ThreadWorker().run());
Run Code Online (Sandbox Code Playgroud)
如果要引用方法,则需要:
new Thread(new ThreadWorker()::run);
Run Code Online (Sandbox Code Playgroud)
也就是说,以下内容要简单得多:
new Thread(new ThreadWorker());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |