Java 使用共享对象实例化多个Runnable的含义?
我有一个多线程程序。我有一个Java 使用共享对象实例化多个Runnable的含义?,java,multithreading,runnable,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++)
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());
Client=newclient();
Util=newutil();
List runnables=new ArrayList();
用于(int i;inewthread(runnable.start());
我很好奇重用runnables中相同的类实例是否是阻塞行为,并从本质上导致我的程序变成单线程?这里:
runnable -> new Thread(runnable).start()
使代码成为多线程的关键点是调用线程对象的start()方法。如果您只需要调用thread类的run方法,那么实际上最终将由“封闭”线程完成所有工作
最后,请注意,直接使用“裸”线程并不理想。了解这一点是可以的,但是Java提供了一些重要的抽象,比如ExecutorService,出于各种原因应该使用它
避免使用原始线程的主要原因是:必须手动控制所有细微的细节。应该使用多少线程?如何共享和共享线程(创建线程会带来很多开销,因此在现实世界中,您可以避免为单个任务创建线程,然后像代码一样将其丢弃)。除此之外:通常您希望解决业务问题。您希望使用多个线程来防止瓶颈情况。Examole:您希望通过网络并行发出多个请求以获取和处理数据。那么您真的只关心最终结果,而不关心低级线程的微妙之处!例如,您可以使用Future或CompleteableFuture对象
只要使用搜索引擎并研究这些术语,你就会找到大量的资料 ^sweet^谢谢@AniketSahrawat@GhostCat足够公平-积分累积!感谢您不顾最佳实践参与讨论;)不用担心,再次感谢!不客气。请不要忘记删除不再需要的评论。谢谢您的评论!您是否介意详细说明使用Executor服务的优势,或者推荐您认为特别有启发性的阅读材料?线程通过BlockingQueues/BlockingDeques共享状态-我发现基于blocksques适当地管理/结束线程相对简单,但当然希望了解更好的方法!上面显示的代码简化为原始问题的范围。使用的线程不会被丢弃,而是长时间运行,并从PriorityBlockingQueue中一次提取一个项目进行处理。我肯定看到了如何使用ExecutorService来管理线程来改进这一点。目前,所有处理步骤都封装在
ProcessRunnable
中,包括多个IO调用-您认为拆分每个步骤并在所有IO上使用CompletableFuture与提交executor服务的可运行列表以处理/执行会有性能差异吗?另外-我知道如何使用搜索引擎!不要轻率或懒惰,只要问问自己是否找到了任何你认为能以特别有用的方式解释或展示事物的来源。你似乎有足够的信心去问这个问题!