请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

线程死锁

我有两个线程:
主线程部分代码(在循环体内)

try {
	// 发送指令
    os.write(buffer);
    os.flush();
} catch (IOException e) {
    e.printStackTrace();
    log.error("Send command ERROR", e);
}

String[] data;
boolean valid;
try {
	//设置超时时间,防止子线程在500毫秒内没返回
    TimeUnit.MILLISECONDS.sleep(500);
    data = modbusReader.getCache().toArray(new String[modbusReader.getCache().size()]);
    valid = CRC16Calc.validate(modbusReader.getCache());
} catch (InterruptedException e) {
	// 子线程主动唤醒主线程
    data = modbusReader.getCache().toArray(new String[modbusReader.getCache().size()]);
    valid = modbusReader.isValid();
}

// XXXXXXXXXXXXXXXXXXXXXX 经过几天的运行,程序停止在该处 XXXXXXXXXXXXX
long t = System.currentTimeMillis() - start;
log.debug("<<<<<<<<<< time=[{}] [{}] [{}] ", t, valid, Arrays.toString(data));

子线程部分代码

@Override
public void run() {
    byte[] buffer = new byte[1024];
    int len;

    try {
        while ((len = is.read(buffer)) != 0) {
            for (int i = 0; i < len; i++) {
                cache.add(String.format("%02X", buffer[i]));
            }
			// 校验数据,如果满足条件,则唤醒主线程
            if (CRC16Calc.validate(cache)) {
                this.valid = true;
                caller.interrupt();
            }
        }
    } catch (Exception e) {
        log.error("Err in Reader of Channel {} \t {}", channelIndex, e.getMessage());
    }
}

正在回答 回答被采纳积分+3

1回答

悟空 2021-04-26 17:56:16

我看到你的主线程,没有处理

interrupt

的代码,所以不会唤醒成功。

0 回复 有任何疑惑可以回复我~
  • 提问者 qq_Mel_0 #1
    主线程中休眠500毫秒的时候处理的
    是不是范围太小了,可能在休眠代码之外触发了interrupt异常?
    回复 有任何疑惑可以回复我~ 2021-04-27 10:22:30
  • 悟空 回复 提问者 qq_Mel_0 #2
    可以参考课程里对于interrupt的演示,后面有详细讲的,分几种情况的。
    回复 有任何疑惑可以回复我~ 2021-04-27 14:49:36
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信