欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

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

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

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

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

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

1.線程饑餓死鎖

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

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

2.線程池大小

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

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

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

3.配置ThreadPoolExecutor線程池

實(shí)例:

1.通過(guò)Executors的工廠方法返回默認(rèn)的一些實(shí)現(xiàn)

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

線程池的隊(duì)列

1.無(wú)界隊(duì)列:任務(wù)到達(dá),線程池飽滿,則任務(wù)在隊(duì)列中等待,如果任務(wù)無(wú)限達(dá)到,則隊(duì)列會(huì)無(wú)限擴(kuò)張

如:?jiǎn)卫凸潭ù笮〉木€程池用的就是此種

2.有界隊(duì)列:如果新任務(wù)到達(dá),隊(duì)列滿則使用飽和策略

3.同步移交:如果線程池很大,將任務(wù)放入隊(duì)列后在移交就會(huì)產(chǎn)生延時(shí),如果任務(wù)生產(chǎn)者很快也會(huì)導(dǎo)致任務(wù)排隊(duì)

SynchronousQueue直接將任務(wù)移交給工作線程

機(jī)制:將一個(gè)任務(wù)放入,必須有一個(gè)線程等待接受,如果沒(méi)有,則新增線程,如果線程飽和,則拒絕任務(wù)

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

飽和策略:

setRejectedExecutionHandler來(lái)修改飽和策略

1.終止Abort(默認(rèn)):拋出異常由調(diào)用者處理

2.拋棄Discard

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

4.CallerRuns:回退任務(wù),有調(diào)用者線程自行處理

4.線程工廠ThreadFactoy

每當(dāng)創(chuàng)建線程時(shí):其實(shí)是調(diào)用了線程工廠來(lái)完成

自定義線程工廠: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());
    //設(shè)置該線程工廠創(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àng)目中使用線程池實(shí)現(xiàn)并發(fā)編程-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)地址:http://chinadenli.net/article36/deeisg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、企業(yè)網(wǎng)站制作、企業(yè)建站、網(wǎng)站內(nèi)鏈外貿(mào)建站、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)