我有一个旨在多线程的程序。我有一个 ProcessRunnable 类,它处理需要大量 IO 的数据。 ProcessRunnable
类都在单独的线程中运行,但使用 client/util 类的共享实例进行实例化。
示例:
Client client = new Client();
Util util = new Util();
List<Runnable> runnables = new ArrayList<>();
for (int i; i < THREAD_COUNT; i++) {
runnables.add(ProcessRunnable
.builder()
.client(client)
.util(util)
.build());
}
runnables.forEach(runnable -> new Thread(runnable).start());
我很好奇在可运行对象中重用相同的类实例是否会阻塞行为并本质上导致我的程序变成单线程?
最佳答案
这里:
runnable -> new Thread(runnable).start()
真正使代码成为多线程的关键点是调用线程对象的 start() 方法。如果您只调用线程类的 run 方法,那么实际上最终会由“封闭”线程完成所有工作。
最后,请注意,直接使用“裸”线程并不理想。了解这一点是可以的,但是 Java 提供了重要的抽象,例如 ExecutorService,出于各种原因应该使用这些抽象。
避免原始线程的主要原因:您必须手动控制所有微妙的细节。应该使用多少个线程?池化和共享线程怎么样(创建线程会带来大量开销,因此在现实世界中,您避免为单个任务创建线程,然后将它们丢弃,就像您的代码一样)。除此之外:通常您想要解决业务问题。您希望使用多线程来防止出现瓶颈情况。示例:您希望通过网络并行发出多个请求来获取和处理数据。那么您实际上只关心最终结果,而不关心低级线程的微妙之处!然后,您可以使用 Future 或 CompleteableFuture 对象。
只需使用搜索引擎并研究这些术语,您就会发现大量 Material 。
关于java - 使用共享对象实例化多个 Runnable 的含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55310710/