使用共享对象实例化多个Runnable的含义?

问题描述 投票:1回答:1

我有一个旨在多线程的程序。我有一个ProcessRunnable类来处理需要大量IO的数据。 ProcessRunnable类都在单独的线程中运行,但是使用client / util Classes的共享实例进行实例化。

例:

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中重用相同的类实例是阻塞行为并且本质上导致我的程序变成单线程?

java multithreading runnable
1个回答
2
投票

这里:

runnable -> new Thread(runnable).start()

实际上使代码成为多线程的关键点是调用线程对象的start()方法。如果你只是调用线程类的run方法,那么你实际上最终会使用“封闭”线程完成所有工作。

最后请注意,直接使用“裸”线程并不理想。可以了解这一点,但Java提供了重要的抽象,例如ExecutorService,应该出于各种原因而使用它。

避免原始线程的主要原因:您必须手动控制所有细微的细节。应该使用多少个线程?如何汇集和共享线程(创建一个线程会带来很多开销,因此在现实世界中,您可以避免为单个任务创建线程,然后将其抛弃,就像您的代码一样)。除此之外:通常你想解决一个业务问题。您想使用多个线程来防止瓶颈情况。 Examole:您希望通过网络并行获取多个请求以获取和处理数据。那么你真的只关心最终结果,而不是关于低级线程细微之处!然后,您将使用Future或CompleteableFuture对象。

只需使用搜索引擎并研究这些术语,您就会发现很多材料。

© www.soinside.com 2019 - 2024. All rights reserved.