如何避免死锁和使用过多线程?

| 使用“ 0”是减少创建过多线程的开销的一种好方法,但是如果所有线程都在等待另一个作业,而该作业本身正在等待池中的空闲线程,则可能导致死锁。有时可以使用多个线程池解决问题,但有时不能解决。我正在寻找类似于ѭ1的东西,除非所有池线程都被阻塞-在这种情况下,尽管池已达到预定义的界限,但池仍应增长。有这样的东西吗? 实际上,僵局在这里并不那么重要。真正的问题是“如何管理正在运行的线程数”而不是它们的总数。当试图保持CPU的充分利用而不产生不必要的许多线程时,这也可能很有趣。     
已邀请:
如果您有争用问题,则这是设计问题。如果您要按照说明进行快速修复,则只能治愈症状,而不能治愈潜在的疾病。 相反,您应该重构设计以使用其他方法消除死锁。     
将池中的线程阻塞以等待同一线程池中的其他线程通常是一个坏主意。 我会尝试将设计更改为非阻塞设计。如果线程需要由同一执行程序处理的另一个操作的结果,我希望它在第二个操作完成后将任务提交给执行程序以运行。或将一个对象放入队列中,以待其他作业完成时再取走。 另外,您可以执行Swing对模态对话框的操作,并使要阻塞的线程启动子线程以继续处理请求,直到父线程解除阻塞为止。但是,这很棘手,并且需要您手动管理线程,这比使用Executor安全得多。     
Executor.newCachedThreadPool();
缓存的线程池将检查是否有可用线程。如果存在,线程池将重新使用该线程。如果不是,则线程池将创建一个新线程。线程的生存时间为60秒,因此60秒后,多余的线程将被终止。     

要回复问题请先登录注册