根据线程名称找到指定的线程,并给该线程停掉

8 篇文章 0 订阅
1 篇文章 0 订阅

//创建jdk的定时器

 

private static String getTimes() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
        Date date = new Date();
        date.setTime(System.currentTimeMillis());
        return format.format(date);
    }


    private static class MyTask implements Runnable {

        @Override
        public void run() {
            index++;
            System.out.println("基础数据同步任务开始执行 " + getTimes() + " " + index);
            GbBaseDataSynJob gbBaseDataSynJob = new GbBaseDataSynJob();

            //gbBaseDataSynJob.batchSynGbBaseData();
            gbBaseDataSynJob.bbb(index);
        }
    }

    public static void main(String[] args) {
        PropertyConfigurator.configure ( "src/srclog4j.properties");
        stp = new ScheduledThreadPoolExecutor(5);
        MyTask mytask = new MyTask();
        //任务结束到下一次任务开始时1秒
        stp.scheduleWithFixedDelay(mytask, 2, 5,TimeUnit.SECONDS);
    }


//创建任务实体

 

 

public class GbBaseDataSynJob {
    public static Logger log = Logger.getLogger(GbBaseDataSynJob.class);
    public void bbb(int   index){
        //创建线程池
        ExecutorService executor = Executors.newCachedThreadPool();
        executor.execute(new CC(index));
    }
    class CC implements Runnable{
        private int type;

        public CC(int type) {
            this.type = type;
        }

        @Override
        public void run(){
            aaa(type);
        }
    }
    public void aaa(int type) {
//获取该线程中的所有的线程
        Map<Thread, StackTraceElement[]>  allThread = Thread.getAllStackTraces();
        List<Thread> ss = allThread.keySet().stream().collect(Collectors.toList());
        for(Thread a:ss){
//打印出所有的线程名称
            log.info(type+"----当前线程池中的线程名称是"+a.getName());
            try {
//找到线程名称为 aaa2 的线程并给他停掉
                if ("aaa2".equals(a.getName())) {
//如果需要找到该线程,并且是在停止该线程之后才能进行其他的操作的话,需要用interrupt停掉之后,再执行此时的线程,所以还需要将当前的线程join到aaa2停掉之后                   
// a.interrupt();
                    //a.join();
//stop 线程仅仅是为了展示效果,不推荐这样直接关闭
                      a.stop();
                }
            }catch (Exception e){
                log.info("异常");
            }
        }
//重新设置该线程的名称
        Thread.currentThread().setName("aaa"+type);
        while(true){}
    }

运行结果:

 

 

任务开始执行 2018-01-05 10:43:31 星期五 1
INFO  - 1----当前线程池中的线程名称是DestroyJavaVM
INFO  - 1----当前线程池中的线程名称是Finalizer
INFO  - 1----当前线程池中的线程名称是pool-1-thread-1
INFO  - 1----当前线程池中的线程名称是pool-1-thread-2
INFO  - 1----当前线程池中的线程名称是Attach Listener
INFO  - 1----当前线程池中的线程名称是pool-2-thread-1
INFO  - 1----当前线程池中的线程名称是Signal Dispatcher
INFO  - 1----当前线程池中的线程名称是Reference Handler
任务开始执行 2018-01-05 10:43:36 星期五 2
INFO  - 2----当前线程池中的线程名称是DestroyJavaVM
INFO  - 2----当前线程池中的线程名称是Finalizer
INFO  - 2----当前线程池中的线程名称是pool-1-thread-1
INFO  - 2----当前线程池中的线程名称是pool-1-thread-2
INFO  - 2----当前线程池中的线程名称是pool-1-thread-3
INFO  - 2----当前线程池中的线程名称是Attach Listener
INFO  - 2----当前线程池中的线程名称是aaa1
INFO  - 2----当前线程池中的线程名称是pool-3-thread-1
INFO  - 2----当前线程池中的线程名称是Signal Dispatcher
INFO  - 2----当前线程池中的线程名称是Reference Handler
任务开始执行 2018-01-05 10:43:41 星期五 3
INFO  - 3----当前线程池中的线程名称是pool-1-thread-4
INFO  - 3----当前线程池中的线程名称是DestroyJavaVM
INFO  - 3----当前线程池中的线程名称是Finalizer
INFO  - 3----当前线程池中的线程名称是pool-1-thread-1
INFO  - 3----当前线程池中的线程名称是pool-1-thread-2
INFO  - 3----当前线程池中的线程名称是pool-1-thread-3
INFO  - 3----当前线程池中的线程名称是Attach Listener
INFO  - 3----当前线程池中的线程名称是aaa1
INFO  - 3----当前线程池中的线程名称是aaa2
INFO  - 3----当前线程池中的线程名称是Signal Dispatcher
INFO  - 3----当前线程池中的线程名称是pool-4-thread-1
INFO  - 3----当前线程池中的线程名称是Reference Handler
任务开始执行 2018-01-05 10:43:46 星期五 4
INFO  - 4----当前线程池中的线程名称是pool-1-thread-4
INFO  - 4----当前线程池中的线程名称是DestroyJavaVM
INFO  - 4----当前线程池中的线程名称是Finalizer
INFO  - 4----当前线程池中的线程名称是pool-3-thread-2
INFO  - 4----当前线程池中的线程名称是pool-1-thread-2
INFO  - 4----当前线程池中的线程名称是pool-1-thread-3
INFO  - 4----当前线程池中的线程名称是aaa1
INFO  - 4----当前线程池中的线程名称是Signal Dispatcher
INFO  - 4----当前线程池中的线程名称是pool-1-thread-5
INFO  - 4----当前线程池中的线程名称是pool-5-thread-1
INFO  - 4----当前线程池中的线程名称是pool-1-thread-1
INFO  - 4----当前线程池中的线程名称是Attach Listener
INFO  - 4----当前线程池中的线程名称是aaa3
INFO  - 4----当前线程池中的线程名称是Reference Handler


      搞定,最终能确定找到了指定的线程,并给他停掉了

 

 

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值