//创建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
搞定,最终能确定找到了指定的线程,并给他停掉了