首页 > 解决方案 > Java中线程失败的常见原因有哪些

问题描述

我们有一个 Java 8 应用程序,它的打印机线程失败/不响应间歇性我只是想知道线程失败的最常见原因是什么,我的理解是线程不能被垃圾收集,因此可以排除,线程的锁定是可能的,我们正在使用 LinkedList 添加删除和 isEmpty。只有当它不会影响主线程或其他线程时才可能出现线程堆栈内存不足。OutOfMemory Heap 不太可能,因为它会影响整个程序。失败/挂起的线程基本上是一个工作线程通过调用 printSystem 线程方法添加到 LinkedList 中,然后通知相同的线程运行方法等待从链表中读取。

 // This method is called by a Worker Thread to add a print message.
 printAdd(object message) {
    synchronized(this)
    { 
      printList.add(message);
      try {
      this.notifty();
      }
      catch(Exception e){} 
   } 
 }

 run() {

 while(true)
   synchronized(this)
     try{
     this.wait();
      while(!printList.isEmpty()) {
             message = printList.remove();
             // Code not show but determines the message type
             // And then sends to the correct printer  


      }
     }
     catch(Exception e){}
   }            

   }
}

标签: java

解决方案


由于 user207421 提到线程故障与任何故障的常见原因相同,此外,因为线程正在处理锁定的共享变量,线程也可能由于线程死锁而挂起。我认为在上面的例子中 printList.isEmpty() 没有被同步可能是问题所在。一种解决方案可能是从不是 ThreadSafe 的 LinkedList 转移到像 BlockingQueue 接口这样的线程安全替代方案。


推荐阅读