关于线程无法控制小记

问题很简单,由于自己在写代码时,搞了一个无厘头的操作,进而造成了很多无效的异常日志。

大体逻辑如下,原本是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);

 

posted @ 2018-06-26 23:25  woniu4  阅读(97)  评论(0编辑  收藏  举报