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();
            }

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

  • 相关阅读:
    什么是DMI,SMBIOS,符合SMBIOS规范的计算机的系统信息获取方法
    Android init.rc执行顺序
    JVM-类的四种载入方式
    Intellij-创建Maven项目速度慢
    Intellij-工程目录下隐藏不想显示的文件和文件夹
    JVM-类加载机制(Java类的生命周期)
    Git-远程仓库的使用
    JavaSE-反射-获取类或者对象的四种方法
    工厂模式(Factory Pattern)
    Redis-配置认证密码
  • 原文地址:https://www.cnblogs.com/aspirant/p/11712332.html
Copyright © 2011-2022 走看看