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

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

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

服務器之家 - 編程語言 - Java教程 - Java 多線程有序執行的幾種方法總結

Java 多線程有序執行的幾種方法總結

2020-08-30 10:49Java之家 Java教程

這篇文章主要介紹了Java 多線程有序執行的幾種方法總結的相關資料,需要的朋友可以參考下

Java 多線程有序執行的幾種方法總結

同事無意間提出了這個問題,親自實踐了兩種方法。當然肯定還會有更多更好的方法。

方法一

?
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
40
41
42
43
44
45
import java.util.concurrent.atomic.AtomicInteger;
 
public class OrderedThread1 {
 
 static AtomicInteger count = new AtomicInteger(0);
 
 public static void main(String[] args) throws InterruptedException {
 Task task1 = new Task(count, 0);
 Task task2 = new Task(count, 1);
 Task task3 = new Task(count, 2);
 Thread thread1 = new Thread(task1);
 Thread thread2 = new Thread(task2);
 Thread thread3 = new Thread(task3);
 thread1.setDaemon(true);
 thread2.setDaemon(true);
 thread3.setDaemon(true);
 thread1.start();
 thread2.start();
 thread3.start();
 
 Thread.sleep(1 * 1000);
 }
 
}
 
class Task implements Runnable {
 
 private AtomicInteger count;
 private int order;
 
 public Task(AtomicInteger count, int order) {
 this.count = count;
 this.order = order;
 }
 
 @Override
 public void run() {
 while (true) {
  if (count.get() % 3 == order) {
  System.out.println(Thread.currentThread().getName() + " ===== "+ order);
  count.incrementAndGet();
  }
 }
 }
}

    這種方法應該是比較常見的解決方案。利用原子遞增控制線程準入順序。

方法二

?
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
40
41
42
43
44
45
46
47
48
49
50
51
public class OrderedThread2 {
 static Holder holder = new Holder();
 public static void main(String[] args) throws InterruptedException {
 
 Task1 task1 = new Task1(holder, 0);
 Task1 task2 = new Task1(holder, 1);
 Task1 task3 = new Task1(holder, 2);
 Thread thread1 = new Thread(task1);
 Thread thread2 = new Thread(task2);
 Thread thread3 = new Thread(task3);
 thread1.setDaemon(true);
 thread2.setDaemon(true);
 thread3.setDaemon(true);
 thread1.start();
 thread2.start();
 thread3.start();
 
 Thread.sleep(1 * 1000);
 
 
 }
 
}
 
class Task1 implements Runnable {
 
 Holder holder;
 int order;
 
 public Task1(Holder holder, int order) {
 this.holder = holder;
 this.order = order;
 }
 
 @Override
 public void run() {
 while (true) {
  if (holder.count % 3 == order) {
  System.out.println(Thread.currentThread().getName() + " ===== "+ order);
  holder.count ++;
  }
 }
// int i = 0;
// while(i ++ < 10000){
//  holder.count ++;
// }
 }
}
class Holder {
 volatile int count = 0;
}

    方法二使用了volatile關鍵字。讓每個線程都能拿到最新的count的值,當其中一個線程執行++操作后,其他兩個線程就會拿到最新的值,并檢查是否符合準入條件。

ps:volatile不是線程安全的。而且兩者沒有任何關系。volatile變量不在用戶線程保存副本,因此對所有線程都能提供最新的值。但試想,如果多個線程同時并發更新這個變量,其結果也是顯而易見的,最后一次的更新會覆蓋前面所有更新,導致線程不安全。在方法二中,一次只有一個線程滿足準入條件,因此不存在對變量的并發更新。volatile的值是最新的與線程安全完全是不相干的,所以不要誤用volatile實現并發控制。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:https://my.oschina.net/u/2333484/blog/861067

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费国产视频 | 国产一区二区三区视频在线观看 | 欧美一区2区| 99精品国产一区二区青青牛奶 | 日日摸夜夜添夜夜添特色大片 | 国产传媒视频 | 国产91精品一区二区绿帽 | 欧美一区二区三区在线观看 | 91精品国产综合久久精品 | 欧美日本韩国一区二区 | 欧美亚洲一区 | 久久久久久久国产 | 亚洲视频一区二区三区 | 日韩三级电影在线观看 | 亚洲国产精品成人 | 高清国产一区二区三区四区五区 | 久久免费国产精品 | 精品久久久久久久久久久久 | 天天看天天爽 | 91久久精品一区二区二区 | 欧美区 日韩区 | 色婷婷综合久久久中字幕精品久久 | 99精品久久久 | 中文字幕1区2区3区 日韩免费高清视频 | 欧美成人自拍 | 久久精品久久久 | 国产日韩一区二区 | 亚洲视频欧美视频 | 黄色片网站视频 | 不卡视频一区二区 | 毛片xxx | 亚洲播放 | 一区二区三区免费在线 | 亚洲激情在线观看 | 成人午夜激情 | 美日韩精品视频 | 欧美影 | 日韩成人免费电影 | 亚洲一区二区中文 | 黑人精品 | 日韩在线中文字幕 |