使用共享对象实例化多个Runnable的java含义?
我有一个多线程程序。我有一个ProcessRunnable
类,它处理需要大量IO的数据。ProcessRunnable
类都在单独的线程中运行,但使用客户机/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());
我很好奇重用runnables中相同的类实例是否是阻塞行为,并从本质上导致我的程序变成单线程
# 1 楼答案
在这里:
使代码真正成为多线程的关键点是调用线程对象的start()方法。如果您只需要调用thread类的run方法,那么实际上最终将由“封闭”线程完成所有工作
最后,请注意,直接使用“裸”线程并不理想。了解这一点是可以的,但是Java提供了一些重要的抽象,比如ExecutorService,出于各种原因应该使用它
避免使用原始线程的主要原因是:必须手动控制所有细微的细节。应该使用多少线程?如何共享和共享线程(创建线程会带来很多开销,因此在现实世界中,您可以避免为单个任务创建线程,然后像代码一样将其丢弃)。除此之外:通常您希望解决业务问题。您希望使用多个线程来防止瓶颈情况。Examole:您希望通过网络并行发出多个请求以获取和处理数据。那么您真的只关心最终结果,而不关心低级线程的微妙之处!例如,您可以使用Future或CompleteableFuture对象
只要使用搜索引擎并研究这些术语,你就会找到大量的资料