java - 在线程中使用 Lambda
问题描述
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());
}
}
例如,如果我使用 lambda:
Thread t1 = new Thread(ThreadWorker :: new);
或者
Thread t1 = new Thread(() ->new ThreadWorker());
那么没有输出,但如果我ThreadWorker
单独创建对象,那么程序运行正常。
有人可以告诉我,这怎么可能?
解决方案
两个都
new Thread(() -> new ThreadWorker());
和
new Thread(ThreadWorker::new);
create aThread
其Runnable
实例的run()
方法只是创建一个ThreadWorker
实例,并且对它不做任何事情。的run()
方法ThreadWorker
不执行。
它们等效于传递以下匿名类实例:
Thread t = new Thread(new Runnable() {
public void run() {
new ThreadWorker ();
}
});
如果要使用 lambda 表达式,则需要:
new Thread(() -> new ThreadWorker().run());
如果你想要一个方法参考,你需要:
new Thread(new ThreadWorker()::run);
也就是说,以下内容要简单得多:
new Thread(new ThreadWorker());
推荐阅读
- windows - 自动在共享上创建文件夹并分配正确的权限
- c# - 如何使用 dotnet 在 linux 上生成资源文件
- android - 属性初始化后 Kotlin 中出现错误的 UninitializedPropertyAccessException
- ssl - 在 httpClient 中使用 POST 时如何确保数据被加密
- ionic3 - 当我有互联网连接时,如何将设备存储上的数据与服务器上的数据同步
- javascript - 使用 Bootstrap Dropdown 和 Jquery 更改 Bootstrap 表单
- android - 使用字符串时加载图像
- java - 第二次使用准备好的语句无法到达临时表
- java - 从另一个类编译并运行java方法
- java - java-静态方法中的“new”运算符