真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

在java項目中使用線程池實現(xiàn)并發(fā)編程-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關在java項目中使用線程池實現(xiàn)并發(fā)編程,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

博州網站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網頁設計、網站建設、微信開發(fā)、APP開發(fā)、響應式網站開發(fā)等網站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)公司公司2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創(chuàng)新互聯(lián)公司。

一、任務和執(zhí)行策略之間的隱性耦合

Executor可以將任務的提交和任務的執(zhí)行策略解耦

只有任務是同類型的且執(zhí)行時間差別不大,才能發(fā)揮大性能,否則,如將一些耗時長的任務和耗時短的任務放在一個線程池,除非線程池很大,否則會造成死鎖等問題

1.線程饑餓死鎖

類似于:將兩個任務提交給一個單線程池,且兩個任務之間相互依賴,一個任務等待另一個任務,則會發(fā)生死鎖;表現(xiàn)為池不夠

定義:某個任務必須等待池中其他任務的運行結果,有可能發(fā)生饑餓死鎖

2.線程池大小

在java項目中使用線程池實現(xiàn)并發(fā)編程

注意:線程池的大小還受其他的限制,如其他資源池:數(shù)據庫連接池

如果每個任務都是一個連接,那么線程池的大小就受制于數(shù)據庫連接池的大小

3.配置ThreadPoolExecutor線程池

實例:

1.通過Executors的工廠方法返回默認的一些實現(xiàn)

2.通過實例化ThreadPoolExecutor(.....)自定義實現(xiàn)

線程池的隊列

1.無界隊列:任務到達,線程池飽滿,則任務在隊列中等待,如果任務無限達到,則隊列會無限擴張

如:單例和固定大小的線程池用的就是此種

2.有界隊列:如果新任務到達,隊列滿則使用飽和策略

3.同步移交:如果線程池很大,將任務放入隊列后在移交就會產生延時,如果任務生產者很快也會導致任務排隊

SynchronousQueue直接將任務移交給工作線程

機制:將一個任務放入,必須有一個線程等待接受,如果沒有,則新增線程,如果線程飽和,則拒絕任務

如:CacheThreadPool就是使用的這種策略

飽和策略:

setRejectedExecutionHandler來修改飽和策略

1.終止Abort(默認):拋出異常由調用者處理

2.拋棄Discard

3.拋棄DiscardOldest:拋棄最舊的任務,注意:如果是優(yōu)先級隊列將拋棄優(yōu)先級最高的任務

4.CallerRuns:回退任務,有調用者線程自行處理

4.線程工廠ThreadFactoy

每當創(chuàng)建線程時:其實是調用了線程工廠來完成

自定義線程工廠:implements ThreadFactory

可以定制該線程工廠的行為:如UncaughtExceptionHandler等

public class MyAppThread extends Thread {
  public static final String DEFAULT_NAME = "MyAppThread";
  private static volatile boolean debugLifecycle = false;
  private static final AtomicInteger created = new AtomicInteger();
  private static final AtomicInteger alive = new AtomicInteger();
  private static final Logger log = Logger.getAnonymousLogger();

  public MyAppThread(Runnable r) {
    this(r, DEFAULT_NAME);
  }

  public MyAppThread(Runnable runnable, String name) {
    super(runnable, name + "-" + created.incrementAndGet());
    //設置該線程工廠創(chuàng)建的線程的 未捕獲異常的行為
    setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
      public void uncaughtException(Thread t,
                     Throwable e) {
        log.log(Level.SEVERE,
            "UNCAUGHT in thread " + t.getName(), e);
      }
    });
  }

  public void run() {
    // Copy debug flag to ensure consistent value throughout.
    boolean debug = debugLifecycle;
    if (debug) log.log(Level.FINE, "Created " + getName());
    try {
      alive.incrementAndGet();
      super.run();
    } finally {
      alive.decrementAndGet();
      if (debug) log.log(Level.FINE, "Exiting " + getName());
    }
  }

  public static int getThreadsCreated() {
    return created.get();
  }

  public static int getThreadsAlive() {
    return alive.get();
  }

  public static boolean getDebug() {
    return debugLifecycle;
  }

  public static void setDebug(boolean b) {
    debugLifecycle = b;
  }
}

分享題目:在java項目中使用線程池實現(xiàn)并發(fā)編程-創(chuàng)新互聯(lián)
轉載來源:http://weahome.cn/article/deeisg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部