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

时间:2019-03-23 04:50:30

标签: java multithreading runnable

我有一个打算用于多线程的程序。我有一个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());

我很好奇,在可运行对象中重用类的相同实例是否会阻止行为并从本质上导致我的程序成为单线程?

1 个答案:

答案 0 :(得分:2)

这里:

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

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

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

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

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