java - 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){}
}
}
}
解决方案
由于 user207421 提到线程故障与任何故障的常见原因相同,此外,因为线程正在处理锁定的共享变量,线程也可能由于线程死锁而挂起。我认为在上面的例子中 printList.isEmpty() 没有被同步可能是问题所在。一种解决方案可能是从不是 ThreadSafe 的 LinkedList 转移到像 BlockingQueue 接口这样的线程安全替代方案。
推荐阅读
- postgresql - 将数据插入 postgres 表
- go - Input错误时BindJSON不返回错误
- tensorflow - 如何在 Keras 中设计自定义回调?
- python - 从 python 中的 txt 文件中抓取特定长度的单词时的问题
- google-app-engine - 项目恢复后部署到 GAE 失败
- tensorflow - tf.train.import_meta_graph 的 TensorFlow 问题 - RuntimeError:会话图为空。在调用 run() 之前向图中添加操作
- google-cloud-platform - 代码 403:“请求缺少有效的 API 密钥。” PERMISSION_DENIED 服务帐户密钥 Google Cloud 语音到 python 中的文本 api"
- angular - 未使用的表达式,期望赋值或函数调用 Promise 函数中的 Angular lint 错误
- javascript - 从 Firebase Auth 用户更新提供者信息(云函数)
- json - 如何在 Go 中解析 Firestore get() 快照 JSON 内容?