国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java實現終止線程池中正在運行的定時任務

Java實現終止線程池中正在運行的定時任務

2021-04-25 12:54hchstudio Java教程

本篇文章給大家分享了JAVA中實現終止線程池中正在運行的定時任務的具體步驟和方法,有需要的朋友跟著學習下。

最近項目中遇到了一個新的需求,就是實現一個可以動態添加定時任務的功能。說到這里,有人可能會說簡單啊,使用quartz就好了,簡單粗暴。然而quartz框架太重了,小項目根本不好操作啊。當然,也有人會說,jdk提供了timer的接口啊,完全夠用啊。但是我們項目的需求完全是多線程的模型啊,而timer是單線程的,so,樓主最后還是選擇了jdk的線程池

線程池是什么

Java通過Executors提供四種線程池,分別為:
newCachedThreadPool :創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
newFixedThreadPool : 創建一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。
newScheduledThreadPool : 創建一個定長線程池,支持定時及周期性任務執行。
newSingleThreadExecutor : 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。

樓主項目中用到的是newScheduledThreadPool, 就這些吧,再多的樓主就班門弄斧了,Google一下,一大堆。

線程池service的獲取

樓主通過單例模式來獲取線程池的service,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
 * 線程池創建.
 * @author wuhf
 * @date 2018/01/16
 */
public class ThreadPoolUtils {
 
  private static ScheduledExecutorService executorService;
 
  private ThreadPoolUtils() {
    //手動創建線程池.
    executorService = new ScheduledThreadPoolExecutor(10,
        new BasicThreadFactory.Builder().namingPattern("syncdata-schedule-pool-%d").daemon(true).build());
  }
 
  private static class PluginConfigHolder {
    private final static ThreadPoolUtils INSTANCE = new ThreadPoolUtils();
  }
 
  public static ThreadPoolUtils getInstance() {
    return PluginConfigHolder.INSTANCE;
  }
 
  public ScheduledExecutorService getThreadPool(){
    return executorService;
  }
 
}

中斷某一個正在運行的線程代碼實現

廢話就不多說了,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
 * 中斷線程池的某個任務.
 */
public class InterruptThread implements Runnable {
 
  private int num;
 
  public InterruptThread (int num){
    this.num = num;
  }
 
  public static void main(String[] args) throws InterruptedException {
 
    Thread interruptThread = new Thread(new InterruptThread(1));
    ScheduledFuture<?> t = ThreadPoolUtils.getInstance().getThreadPool().scheduleAtFixedRate(interruptThread,0,2,
        TimeUnit.SECONDS);
 
    InterruptThread interruptThread1 = new InterruptThread(2);
    ThreadPoolUtils.getInstance().getThreadPool().scheduleAtFixedRate(interruptThread1,0,2,
        TimeUnit.SECONDS);
 
    InterruptThread interruptThread2 = new InterruptThread(3);
    ThreadPoolUtils.getInstance().getThreadPool().scheduleAtFixedRate(interruptThread2,0,2,
        TimeUnit.SECONDS);
    Thread.sleep(5000);
 
        //終止正在運行的線程interruptThread
    t.cancel(true);
    while (true){
 
    }
  }
 
  @Override
  public void run() {
    System.out.println("this is a thread" + num);
  }
}

踩坑記錄

樓主在使用如下代碼時,突然想到當這個定時任務需要被停止時該如何停止線程運行

?
1
2
ThreadPoolUtils.getInstance().getThreadPool().scheduleAtFixedRate(interruptThread,0,2,
        TimeUnit.SECONDS);

既然我有這樣的需求,那就Google一下吧,找了大半圈,愣是沒找到相關資料,都是一些關于Java線程池的深入分析。或者是全局變量啥的,并沒有找到令樓主滿意的解決方案。

既然沒有線程的那就扒一下scheduleAtFixedRate的底層源碼看看是什么東西吧,果不其然我在源碼中看到了scheduleAtFixedRate方法的具體實現,發現他的返回值是ScheduledFuture。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
                         long initialDelay,
                         long period,
                         TimeUnit unit) {
    if (command == null || unit == null)
      throw new NullPointerException();
    if (period <= 0)
      throw new IllegalArgumentException();
    ScheduledFutureTask<Void> sft =
      new ScheduledFutureTask<Void>(command,
                     null,
                     triggerTime(initialDelay, unit),
                     unit.toNanos(period));
    RunnableScheduledFuture<Void> t = decorateTask(command, sft);
    sft.outerTask = t;
    delayedExecute(t);
    return t;
  }

接著往下我們再看看ScheduledFuture里面有什么東西吧,沒有讓樓主失望,看到了這個

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public boolean cancel(boolean mayInterruptIfRunning) {
      boolean cancelled = super.cancel(mayInterruptIfRunning);
      if (cancelled && removeOnCancel && heapIndex >= 0)
        remove(this);
      return cancelled;
}
      
//從線程的運行隊列中移除當前線程
public boolean remove(Runnable task) {
    boolean removed = workQueue.remove(task);
    tryTerminate(); // In case SHUTDOWN and now empty
    return removed;
}

再往上查super.cancel(mayInterruptIfRunning)是什么東西,我們看到了這個,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//通過調用線程的interrupt方法終止線程運行
public boolean cancel(boolean mayInterruptIfRunning) {
    if (!(state == NEW &&
       UNSAFE.compareAndSwapInt(this, stateOffset, NEW,
         mayInterruptIfRunning ? INTERRUPTING : CANCELLED)))
      return false;
    try // in case call to interrupt throws exception
      if (mayInterruptIfRunning) {
        try {
          Thread t = runner;
          if (t != null)
            t.interrupt();
        } finally { // final state
          UNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED);
        }
      }
    } finally {
      finishCompletion();
    }
    return true;
  }

到這里所有的問題都迎刃而解。

總結一下吧

項目中總是會遇到比較難搞的解決方案,當Google不太好找時,翻一下jdk的源碼或許也是一個不錯的方法。

原文鏈接:http://www.hchstudio.cn/article/2018/cc2a/

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 黄免费| 中文字幕一区二区在线观看 | 国产日产久久高清欧美一区 | 国产福利二区 | 不卡黄色片| 亚洲精品日韩综合观看成人91 | 免费在线成人网 | 欧美怡红院视频一区二区三区 | 中文字幕高清一区 | 午夜视频网 | 一呦二呦三呦国产精品 | 久久精品久久综合 | 在线观看三区 | 91精品国产乱码久久久久久 | 午夜精品久久久久久久男人的天堂 | 久久成人免费视频 | 欧美日韩在线免费 | 操操操影院 | 国内自拍偷拍 | 欧美精品1 | 黄色大片在线播放 | 青青国产视频 | 一区二区视频在线观看 | 亚洲视频在线观看视频 | 日本一区二区视频在线播放 | 啪啪导航| 国产精品美女一区 | 日韩中文字幕在线视频 | 欧美视频在线一区 | 爱爱免费视频 | 99精品热视频 | 亚洲欧洲视频 | 欧美色综合网 | 亚洲成av人片在线观看香蕉 | 中文字幕日韩欧美一区二区三区 | 一级片网址 | 亚洲精品乱码久久久久久金桔影视 | 永久91嫩草亚洲精品人人 | 日韩欧美高清视频 | 亚洲一区视频在线 | 亚洲第一成人在线视频 |