线程死锁

来源:5-6 抛出异常

qq_Mel_0

2021-04-26

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

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());
    }
}
写回答

1回答

悟空

2021-04-26

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

interrupt

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

0
2
悟空
回复
qq_Mel_0
可以参考课程里对于interrupt的演示,后面有详细讲的,分几种情况的。
2021-04-27
共2条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程