有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用共享对象实例化多个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) 个答案

  1. # 1 楼答案

    在这里:

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

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

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

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

    只要使用搜索引擎并研究这些术语,你就会找到大量的资料