关于线程无法控制小记
问题很简单,由于自己在写代码时,搞了一个无厘头的操作,进而造成了很多无效的异常日志。
大体逻辑如下,原本是5s循环一次线程,结果造成了在异常产生时,等于进入了死循环逻辑。这样就在不断的输出异常日志,影响了问题定位的效率。
解决办法,也很简单,将Thread.sleep(5000)移至异常抛出之后,就不会有这个问题,或者使用JDK提供的周期类来实现定时周期任务这个功能。
public class ThrowException implements Runnable{ private boolean flag; public ThrowException(boolean flag) { this.flag = flag; } @Override public void run() { while(true) { try { //Thread.sleep(5000);//将其移至这里,也是个不错的原则,避免了try语句 if(!flag) { throw new Exception();//实际是业务处理出来问题,抛出异常。 } System.out.println("hello "); Thread.sleep(5000); } catch (Exception e) { System.out.println("exception " + e); } // try { // Thread.sleep(5000);//将其移至这里,就不会造成线程周期不受控制的问题,但是这样会引入一个新的try语句。 // } catch (InterruptedException e) { // e.printStackTrace(); // } } } }
使用JDK的解决方式:
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); executor.scheduleAtFixedRate(new ThrowException(false), 1000, 5000, TimeUnit.MILLISECONDS);