zoukankan      html  css  js  c++  java
  • 调试时,子线程无缘无故终止了

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

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

     如果想调试,需要阻塞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();
            }

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

  • 相关阅读:
    异常处理与调试2
    异常处理与调试
    异常处理与调试
    身份证校验程序(下)- 零基础入门学习Delphi49
    身份证校验程序(下)- 零基础入门学习Delphi49
    身份证校验程序(上)- 零基础入门学习Delphi48
    身份证校验程序(上)- 零基础入门学习Delphi48
    python -- 面向对象三大特性
    python -- 面向对象初识
    python成长之路八 -- 内置函数
  • 原文地址:https://www.cnblogs.com/aspirant/p/11712332.html
Copyright © 2011-2022 走看看