调试时,子线程无缘无故终止了

自己写了个函数,开了个主线程,然后在主线程上面开了个子线程,但是在调试的时候,总是无缘无故的子线程终止了,没有任何缘由。

后来同事点拨才知道,我们调试的时候,因为主线程终止了,所以子线程你在调试的时候也终止了,并不是代码的问题。

 如果想调试,需要阻塞5分钟,这样就可以看到子线程的运行了。

代码如下:

 //3.添加定时任务
    @Scheduled(cron = "0 0 1 * * ?")
        public String getHiveData() throws Exception {
            final String uuid = UUID.randomUUID().toString();
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, -1); //得到前一天
            Date date = calendar.getTime();
            DateFormat df = new SimpleDateFormat(DATE_FORMAT_SHORT_SIMPLE.getValue());
            System.out.println(df.format(date));

 String dt=df.format(date);
        executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    queryHiveData(dt,uuid);
                } catch (Exception e) {
                    log.error("meet queryHiveData exception", e);
                }
            }
        });

        try {
            Thread.sleep(5*60*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return uuid;
    }
   private String queryHiveData(String dt,String uuid) throws Exception {

//            final AtomicInteger successCount = new AtomicInteger();
//        final AtomicInteger errorCount = new AtomicInteger();
        Map<String, String> statusMap = new HashMap<>(2);
        AsyncTalosClient talos = null;
        try {
            Engine engine = Engine.Presto;
            String dsn = "hlog";
            talos = new AsyncTalosClient(username, password);
            //必须开启session
            talos.openSession();

            //强引用,虚拟机栈结束之后会自动回收
            List<Map<String, String>> statusList = new ArrayList<>();
            //软引用包装
            SoftReference<List<Map<String, String>>> softReference = new SoftReference<>(statusList);
            concurrentHashMap.put(uuid, softReference);
return null;
}

请注意这两段代码: 之前在没有阻塞主线程就是下面的代码的时候,调试的时候,子线程每次都会执行到:Engine engine = Engine.Presto;

就终止了 无缘无故,无法跟踪,后来加了下面的阻塞的代码:

 try {
            Thread.sleep(5*60*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

子线程就可以继续调试了,当部署生产的时候,就把这个阻塞去掉,就行了;

 

posted @ 2019-10-21 11:16  aspirant  阅读(908)  评论(0编辑  收藏  举报