在Java中的线程内调用线程时应该考虑什么?它应该被避免吗?
我正尝试使用多线程,实际上是一个线程池,用于一大组并发任务。不幸的是,线程所需要使用的工具也是通过使用线程来实现的,它由第三方提供。使用线程内部线程安全吗?什么应该考虑或应该完全避免。在Java中的线程内调用线程时应该考虑什么?它应该被避免吗?
在线内使用线程安全吗?
如果库是线程安全的,您应该可以从多个线程使用它。
应该考虑什么或应该完全避免。
如上所述,你应该确保所有参与类(库类,和你的类)是线程安全的。
我个人试图完全避免几个线程,至少使用或作为高级构造,例如使用java.util.concurrent
包中的类。
你可能想在
- The Java™ Tutorials: Thread Pools阅读起来,
- 的
ExecutorService
的各种实现。
所有线程都用在其他线程的“内部”。 (除了你开始的那个)
也许你可以更详细地解释你的疑问。
谢谢,彼得。更多细节在这里: –
谢谢,彼得。更多细节在这里:我在为网络发现做泛洪ping,icmp ping包是使用线程实现的,我试图实现的并发ping会使用线程池,例如Quartz包。这样做是否安全?从测试中,icmp ping一段时间刚刚被阻塞,并且内存消耗非常迅速。 –
我不明白为什么从Quartz线程开始,它不会有正常的问题(它可以工作,也可以不用)。如果你的线程池没有限制,你可能会遇到资源问题。解决这个问题的唯一方法就是正确配置库或修复代码。用ping来淹没网络可能不是那么有用。也许你可以使用广播ping。 –
我认为没有这样的概念'线内线程' 所有的线程都被某个线程或另一个线程调用。 (除了少数明显的) 所以他们都有点平行。
感谢您的澄清。我现在得到一些想法 –
应该考虑什么或应该完全避免。
几件事情需要考虑:
- 线程是资源饿了。
- 创建线程很昂贵。
- 线程池改善了线程创建的成本,但是在某些情况下,有界线程池会导致致命的问题。
- 线程不利于解决分而治之的问题,除非你的算法明智地使用线程。 (不要使用/浪费线程,你应该使用递归。)
我说的致命问题是线程递归fork其他线程并等待它们完成。如果使用无界线程池,则最终可能会有不合理数量的线程。如果使用有界的线程池,则可能会以死锁的形式结束,所有线程都在使用中,并且(可能)所有线程都被阻塞,等待创建更多线程。
(这听起来像你的情况下有这种可能性。)
感谢Stephen的建议。你提到的潜在问题实际上发生在我身上,可能是僵局。我会尽力确认它。 –
线程不会运行在其他线程的“内部”。线程运行**并行**到其他线程,**在一个公共(父级)进程内部。**事实上,从根本上讲,您看起来并不了解线程是什么,这表明您应该避免使用它们学习基础知识。 –
谢谢你们,请在下面的回答中看到更多的细节 –