Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中线程失败的常见原因是什么_Java - Fatal编程技术网

Java中线程失败的常见原因是什么

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

我们有一个Java 8应用程序,它的打印机线程出现故障/没有间歇性响应我只是想知道线程故障最常见的原因是什么,我的理解是线程不能被垃圾收集,因此可以排除,线程的锁定是可能的,我们正在使用LinkedList add-remove和isEmpty。只有在不影响主线程或其他线程的情况下,线程的内存堆栈才会出现。OutOfMemory堆不太可能,因为它会影响整个程序。失败/挂起的线程基本上是一个工作线程,通过调用printSystem threads方法添加到LinkedList,然后通知等待从链接列表读取的同一线程运行方法来添加到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){}
   }            

   }
}

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

尝试读取异常消息。您的线程很可能挂在
IO
上。要调查问题,请运行
strace-f
并检查输出。试着找一些
write
/
sendmsg
/等等。。。赛考尔。这可能会揭示问题。
catch{}
不是合法的Java。线程故障的常见原因与任何故障的常见原因相同。不清楚你在问什么。如果线程抛出一些未破坏的东西,那么最终会杀死线程。仅仅因为这种事情而依赖一个专用线程是非常脆弱的。也许可以尝试在线程上使用一个未捕获的异常处理程序来记录杀死它的原因?顺便说一句,这不是使用wait(没有条件变量)的好方法。