實際應用java多線程 java 多線程應用
2023-06-09
情景1
如果有Thread11、Thread2、ThreaD3、四條線程各自統計CThread4。、D、E、四盤大小,全過程統計完畢,交給Thread5進程進行匯總,該如何實現?
第一,通過java.util.concurrent.在Executors中創(chuàng)建一個線程池,并使用這個線程池來啟動這個過程。啟動所有要啟動的過程后,執(zhí)行線程池的shutdown()方法,即在所有過程完成后關閉線程池。然后通過isTerminated()線程池的方法來判斷線程池是否已關閉。成功關閉線程池,意味著整個過程已經完成。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String args[]) throws InterruptedException {
ExecutorService exe = Executors.newFixedThreadPool(50);
for (int i = 1; i <= 5; i ) {
exe.execute(new SubThread(i));
}
exe.shutdown();
while (true) {
if (exe.isTerminated()) {
System.out.println(“結束了!");
break;
}
Thread.sleep(200);
}
}
}
View Code
2)使用T.join,讓主線程等待這些工作線程結束。
public class 011JoinTester implements Runnable {
private String name;
public 011JoinTester(String name) {
this.name = name;
}
public void run() {
System.out.printf("%s begins: %s\n", name, new Date());
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("%s has finished: %s\n", name, new Date());
}
public static void main(String[] args) {
while (true){
Thread thread1 = new Thread(new “JoinTester01”O(jiān)ne"));
Thread thread2 = new Thread(new “JoinTester01”Two"));
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Main thread is finished");
}
}
}
View Code
情景2
實現經典消費模式
1 package com.example.demo.consumer;
2
3 import java.util.LinkedList;
4
5 /**
6 * 生產者和消費者之間的問題
7 * wait、notify/notifyAll() 實現
8 */
9 public class Storage1 implements AbstractStorage {
10 //倉庫最大容量
11 private static final int _1MB = 128;
12 private final int MAX_SIZE = 100;
13 //倉庫存儲載體
14 private LinkedList list = new LinkedList();
15 //private Object object = new Object();
16 //進行生產
17 public void produce(int num){
18 //同步
19 synchronized (list){
20 //倉庫剩余容量不足以儲存即將生產的總產量,暫停生產
21 while(list.size() num > MAX_SIZE){
22 System.out.println("""要生產的產品數量":" num "\t【庫存量】:"
23 list.size() "\t暫時無法完成生產任務!");
24
25 try {
26 //不符合條件,生產堵塞
27 list.wait();
28 } catch (InterruptedException e) {
29 e.printStackTrace();
30 }
31 }
32
33 for(int i=0;i list.size()){
50 System.out.println(“要消費的產品數量”:" num "\t【庫存量】:"
51 list.size() "\t暫時無法完成消費任務!");
52
53 try {
54 list.wait();
55 } catch (InterruptedException e) {
56 e.printStackTrace();
57 }
58 }
59 //滿足消費條件,開始消費
60 for(int i=0;i
Storage1
public class Test{
public static void main(String[] args) {
// 倉庫目標
AbstractStorage abstractStorage = new ()Storage1();
// 生產者目標
Producer p1 = new Producer(abstractStorage);
Producer p2 = new Producer(abstractStorage);
Producer p3 = new Producer(abstractStorage);
Producer p4 = new Producer(abstractStorage);
Producer p5 = new Producer(abstractStorage);
Producer p6 = new Producer(abstractStorage);
Producer p7 = new Producer(abstractStorage);
// 顧客目標
Consumer c1 = new Consumer(abstractStorage);
Consumer c2 = new Consumer(abstractStorage);
Consumer c3 = new Consumer(abstractStorage);
// 設定生產者產品制造數量。
p1.setNum(10);
p2.setNum(10);
p3.setNum(10);
p4.setNum(10);
p5.setNum(10);
p6.setNum(10);
p7.setNum(80);
// 設定客戶消費商品的數量
c1.setNum(50);
c2.setNum(20);
c3.setNum(30);
// 進程開始實施
c1.start();
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// abstractStorage.test();
c2.start();
c3.start();
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
p6.start();
p7.start();
}
}
main function
to be continued
本文為轉載內容,我們尊重原作者對本文的作權。如有內容錯誤或侵權問題,歡迎原作者聯系我們更正或刪除內容。
本文僅代表作者觀點,版權歸原創(chuàng)者所有,如需轉載請在文中注明來源及作者名字。
免責聲明:本文系轉載編輯文章,僅作分享之用。如分享內容、圖片侵犯到您的版權或非授權發(fā)布,請及時與我們聯系進行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com