一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java多線程的調(diào)度_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

Java多線程的調(diào)度_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

2020-10-27 16:47動(dòng)力節(jié)點(diǎn) JAVA教程

有多個(gè)線程,如何控制它們執(zhí)行的先后次序呢?下文給大家分享四種方法及java多線程調(diào)度的實(shí)例代碼,需要的朋友參考下吧

有多個(gè)線程,如何控制它們執(zhí)行的先后次序?

        方法一:設(shè)置線程優(yōu)先級(jí)。

        java.lang.Thread 提供了 setPriority(int newPriority) 方法來(lái)設(shè)置線程的優(yōu)先級(jí),但線程的優(yōu)先級(jí)是無(wú)法保障線程的執(zhí)行次序的,優(yōu)先級(jí)只是提高了優(yōu)先級(jí)高的線程獲取 CPU 資源的概率。也就是說(shuō),這個(gè)方法不靠譜。

        方法二:使用線程合并。

        使用 java.lang.Thread 的 join() 方法。比如有線程 a,現(xiàn)在當(dāng)前線程想等待 a 執(zhí)行完之后再往下執(zhí)行,那就可以使用 a.join()。一旦線程使用了 a.join(),那么當(dāng)前線程會(huì)一直等待 a 消亡之后才會(huì)繼續(xù)執(zhí)行。什么時(shí)候 a 消亡?a 的 run() 方法執(zhí)行結(jié)束了 a 就消亡了。

        這個(gè)方法可以有效地進(jìn)行線程調(diào)度,但卻只能局限于等待一個(gè)線程的執(zhí)行調(diào)度。如果要等待 N 個(gè)線程的話,顯然是無(wú)能為力了。而且等待線程必須在被等待線程消亡后才得到繼續(xù)執(zhí)行的指令,無(wú)法做到兩個(gè)線程真正意義上的并發(fā),靈活性較差。

        方法三:使用線程通信。

        java.lang.Object 提供了可以進(jìn)行線程間通信的 wait 與 notify 、notifyAll 等方法。每個(gè) Java 對(duì)象都有一個(gè)隱性的線程鎖的概念,通過(guò)這個(gè)線程鎖的概念我們讓線程間可以進(jìn)行通信,各線程不再埋頭單干。著名的“生產(chǎn)者-消費(fèi)者”模型就是基于這個(gè)原理實(shí)現(xiàn)的。

        這個(gè)方法也可以有效地進(jìn)行線程調(diào)度,而且也不僅僅局限于等待一個(gè)線程的執(zhí)行調(diào)度,具有很大程度上的靈活性。但操作復(fù)雜,不易控制容易造成混亂,程序維護(hù)起來(lái)也不太方便。

        方法四:使用閉鎖。

        閉鎖就像一扇門,在先決條件未達(dá)成之前這扇門是閉著的,線程無(wú)法通過(guò),先決條件達(dá)成之后,閉鎖打開(kāi),線程就可以繼續(xù)執(zhí)行了。java.util.concurrent.CountDownLatch 是一個(gè)很實(shí)用的閉鎖實(shí)現(xiàn),它提供了 countDown() 和 await() 方法達(dá)成線程執(zhí)行隊(duì)列,這個(gè)方法最適合 M 個(gè)線程等待 N 個(gè)線程執(zhí)行結(jié)束再執(zhí)行的情況。首先初始化一個(gè) CountDownLatch 對(duì)象,比如 CountDownLatch doneSignal = new CountDownLatch(N);該對(duì)象具有 N 作為計(jì)數(shù)閥值,每個(gè)被等待線程通過(guò)對(duì) doneSignal 對(duì)象的持有,使用 countDown() 可以將 doneSignal 的計(jì)數(shù)閥值減一;每個(gè)等待線程通過(guò)對(duì) doneSignal 對(duì)象的持有,使用 await() 阻塞當(dāng)前線程,直到 doneSignal 計(jì)數(shù)閥值減為 0,才繼續(xù)往下執(zhí)行。

        這個(gè)方法也可以有效地進(jìn)行線程調(diào)度,而且比方法三更易于管理,開(kāi)發(fā)者只需控制好 CountDownLatch 即可。但線程執(zhí)行次序管理相對(duì)單一,它只是指出當(dāng)前等待線程的數(shù)量,而且 CountDownLatch 的初始閥值一旦設(shè)置就只能遞減下去,無(wú)法重置。如需遞減過(guò)程中進(jìn)行閥值的重置可以參考 java.util.concurrent.CyclicBarrier。

        不管如何,CountDownLatch 對(duì)于一定條件下的線程隊(duì)列的達(dá)成還是很有用的。對(duì)于復(fù)雜環(huán)境下的線程管理還是卓有成效的。所以熟悉和把握對(duì)它的使用還是很有必要的。

        以下是一個(gè)實(shí)際項(xiàng)目中 CountDownLatch 的使用的例子:

?
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
39
private Map<Long,DecryptSignalAndPath> afterDecryptFilePathMap = new HashMap<Long,DecryptSignalAndPath>();//TODO 注意容器垃圾數(shù)據(jù)的清理工作
class DecryptRunnable implements Runnable {
  private ServerFileBean serverFile;
  private Long fid;//指向解密文件
  private CountDownLatch decryptSignal;
  protected DecryptRunnable(Long fid, ServerFileBean serverFile, CountDownLatch decryptSignal) {
    this.fid = fid;
    this.serverFile = serverFile;
    this.decryptSignal = decryptSignal;
  }
  @Override
  public void run() {
    //開(kāi)始解密
    String afterDecryptFilePath = null;
    DecryptSignalAndPath decryptSignalAndPath = new DecryptSignalAndPath();
    decryptSignalAndPath.setDecryptSignal(decryptSignal);
    afterDecryptFilePathMap.put(fid, decryptSignalAndPath);
    afterDecryptFilePath = decryptFile(serverFile);
    decryptSignalAndPath.setAfterDecryptFilePath(afterDecryptFilePath);
    decryptSignal.countDown();//通知所有阻塞的線程
  }
   
}
class DecryptSignalAndPath {
  private String afterDecryptFilePath;
  private CountDownLatch decryptSignal;
  public String getAfterDecryptFilePath() {
    return afterDecryptFilePath;
  }
  public void setAfterDecryptFilePath(String afterDecryptFilePath) {
    this.afterDecryptFilePath = afterDecryptFilePath;
  }
  public CountDownLatch getDecryptSignal() {
    return decryptSignal;
  }
  public void setDecryptSignal(CountDownLatch decryptSignal) {
    this.decryptSignal = decryptSignal;
  }
}

        需要先執(zhí)行的,被等待線程在這里加入:

?
1
2
3
4
5
6
7
CountDownLatch decryptSignal = new CountDownLatch(1);
new Thread(new DecryptRunnable(fid, serverFile, decryptSignal)).start();//無(wú)需拿到新線程句柄,由 CountDownLatch 自行跟蹤
try {
  decryptSignal.await();
} catch (InterruptedException e) {
  // TODO Auto-generated catch block
}

        需要后執(zhí)行,等待的線程可以這樣加入:

?
1
2
3
4
5
6
CountDownLatch decryptSignal = afterDecryptFilePathMap.get(fid).getDecryptSignal();  
 try {
   decryptSignal.await();
 } catch (InterruptedException e) {
   // TODO Auto-generated catch block
 }

        當(dāng)然,這也僅僅只是一個(gè)簡(jiǎn)單的 CountDownLatch 的使用展示,對(duì)于 CountDownLatch 來(lái)說(shuō)有點(diǎn)大材小用了,因?yàn)樗梢詣偃胃鼜?fù)雜的多線程環(huán)境。示例中的案例完全可以使用線程通信進(jìn)行搞定。因?yàn)?CountDownLatch 的閥值初始為 1,所以這里甚至完全可以使用方法二所說(shuō)的線程的合并進(jìn)行取代。

        如果讀者覺(jué)得以上示例不夠清晰,也可以參考 JDK API 提供的 demo,這個(gè)清晰明了:

?
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
class Driver2 { // ...
 void main() throws InterruptedException {
  CountDownLatch doneSignal = new CountDownLatch(N);
  Executor e = ...
 
  for (int i = 0; i < N; ++i) // create and start threads
   e.execute(new WorkerRunnable(doneSignal, i));
 
  doneSignal.await();      // wait for all to finish
 }
}
 
class WorkerRunnable implements Runnable {
 private final CountDownLatch doneSignal;
 private final int i;
 WorkerRunnable(CountDownLatch doneSignal, int i) {
  this.doneSignal = doneSignal;
  this.i = i;
 }
 public void run() {
  try {
   doWork(i);
   doneSignal.countDown();
  } catch (InterruptedException ex) {} // return;
 }
 
 void doWork() { ... }
}

以上所述是小編給大家介紹的Java多線程的調(diào)度,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 歪歪私人影院成人毛片 | 国产精品麻豆99久久 | 天堂激情网 | 男人天堂视频网 | 亚瑟天堂久久一区二区影院 | 欧美女人p | 免费观看欧美一级高清 | 国产视频一区二区 | 草草免费观看视频在线 | 国产一区二区三区四区波多野结衣 | 国产青青操 | 精品一区二区三区免费毛片 | 色综合久久夜色精品国产 | 亚洲国产日韩欧美一区二区三区 | 双性人bbww欧美双性 | 国产在线观看a | 99久久中文字幕伊人 | 大ji巴好好爽好深网站 | 国产第一自拍 | chinese男gay飞机同志 | 精品一区二区三区高清免费观看 | 欧美视频一区二区三区在线观看 | 1024在线视频精品免费 | 极品妖艳许清赵丽全文免费阅读 | 好吊色永久免费视频大全 | 日韩欧美一区二区三区免费看 | 国内精品国语自产拍在线观看55 | 成人福利在线播放 | 国产精品国产香蕉在线观看网 | 99久久精品国产一区二区 | 青青热久免费精品视频网站 | 涩情主播在线翻车 | 日韩日b视频 | 国产极品麻豆91在线 | 成人在线av视频 | 天堂在线看| 日本不卡在线视频高清免费 | blackedhd 18sex| 极品手交handjobtattoo| 2020年精品国产午夜福利在线 | 精品亚洲永久免费精品 |