idea多线程调试 以及 java线程无法中断!原因竟然是.....

微信谣言体标题23333333

新手垃圾问题预警!大神请绕道!不要鄙视我!

说来惭愧这个问题找了挺久,作为一个并发编程渣渣,甚至都不知道怎么用idea进行多线程调试,这次虽然找问题找了半天,但也算有点收获

场景是我要开一个线程去定期用各种参数请求一个接口,来缓存这个接口的结果,用于兜底服务,并且服务本身提供了一个接口用于停止线程并重新创建一个线程从头来。
我的做法是搞了一个单线程池,下面分别是停止线程和启动线程的方法(去掉了不关键的内容):

  private void shutdown() {
  	// service是个单线程池
    if (service != null && !service.isTerminated()) {
      run = false;
      service.shutdownNow();
      while (!service.isTerminated()) {
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          log.error("thread interrupted", e);
        }
      }
    }
  }
public void refresh() {
    service = Executors.newSingleThreadExecutor();
    service.submit(() -> {
      ...
    });
  }

这两个方法必须配套调用的,所以其实有点脱裤子放屁了,还不如就写到一个方法里,省的夜长梦多,这是其一。其二,即使我写到一个方法里,或者确保是成对调用的,就能保证只有一个线程(池)吗,并不能,如果两个请求同时开始这个方法,就会创建两个线程池了,所以在方法上加上@Synchronized才保险

回到正题,从文章标题可以看出,我遇到的主要问题是调用了shutdownNow()方法竟然没用,线程没有被终止,走到了sleep也没有抛出InterruptedException,这就有点不科学了,而且最可怕的不是遇到问题,而是这个问题时而出现时而不出现!!我没头绪地找了好久,静下来思考一下,可以推断出,线程不可能没有抛错,肯定是在什么地方这个错误被吞掉了,所以interrupt信号也就没用了,最后终于定位到,我自己把发送请求的代码用trycatch包起来做了处理,但是这里竟然直接使用Exception来捕捉,没有单独对InterruptedException做处理,真是自己被自己坑了

刚为了写这个又在调试代码了,遇到一个新问题,乱入一句:数组操作要自己用try,catch捕捉错误,否则下标越界不抛异常,找问题又要半天

最后顺带说一下idea的多线程调试??
其实咱们目标很简单,就是希望我打了个断点,每个线程到这边都停住,而且我可以选择哪个线程继续往下走,是不是一切尽在掌握之中了!
那么第一步,打断点,然后右键断点,选择Thread模式,这样就确保每个线程到这里都会停住
idea多线程调试 以及 java线程无法中断!原因竟然是.....
好了,可以开始调试了,当某个线程到达了某个断点时,左下角会弹出提示:
idea多线程调试 以及 java线程无法中断!原因竟然是.....
然以你就可以保持现状或者在线程列表中选择这个线程去做调试:
idea多线程调试 以及 java线程无法中断!原因竟然是.....

妈妈再也不用担心我不会调试多线程了