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

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

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

服務器之家 - 編程語言 - Java教程 - 淺談Java的兩種多線程實現方式

淺談Java的兩種多線程實現方式

2020-12-21 11:09翡翠森林Z Java教程

本篇文章主要介紹了淺談Java的兩種多線程實現方式,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

本文介紹了淺談Java的兩種多線程實現方式,分享給大家。具有如下:

一、創建多線程的兩種方式

Java中,有兩種方式可以創建多線程:

1 通過繼承Thread類,重寫Thread的run()方法,將線程運行的邏輯放在其中

2 通過實現Runnable接口,實例化Thread類
在實際應用中,我們經常用到多線程,如車站的售票系統,車站的各個售票口相當于各個線程。當我們做這個系統的時候可能會想到兩種方式來實現,繼承Thread類或實現Runnable接口,現在看一下這兩種方式實現的兩種結果。

程序1:

?
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
52
53
package z;
 
class MyThread extendsThread{ 
 
  privateintticket = 10;
 
  privateString name;
 
  publicMyThread(String name){
 
    this.name =name;
 
  }
 
   
 
  publicvoidrun(){
 
    for(inti = 0; i < 500; i++){
 
      if(this.ticket > 0){
 
        System.*out*.println(this.name+"賣票---->"+(this.ticket--));
 
      }
 
    }
 
  }
 
}
 
 
 
public classThreadDemo {
 
  publicstaticvoidmain(String[] args) {
 
    MyThread mt1= newMyThread("一號窗口");
 
    MyThread mt2= newMyThread("二號窗口");
 
    MyThread mt3= newMyThread("三號窗口");
 
    mt1.start();
 
    mt2.start();
 
    mt3.start();
 
  }
 
}

運行結果:

一號窗口賣票---->10

一號窗口賣票---->9

一號窗口賣票---->8

一號窗口賣票---->7

一號窗口賣票---->6

一號窗口賣票---->5

一號窗口賣票---->4

一號窗口賣票---->3

一號窗口賣票---->2

一號窗口賣票---->1

三號窗口賣票---->10

三號窗口賣票---->9

三號窗口賣票---->8

三號窗口賣票---->7

二號窗口賣票---->10

二號窗口賣票---->9

二號窗口賣票---->8

三號窗口賣票---->6

三號窗口賣票---->5

三號窗口賣票---->4

三號窗口賣票---->3

二號窗口賣票---->7

二號窗口賣票---->6

二號窗口賣票---->5

二號窗口賣票---->4

二號窗口賣票---->3

二號窗口賣票---->2

二號窗口賣票---->1

三號窗口賣票---->2

三號窗口賣票---->1

程序2:

?
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
package z;
 
class MyThread1 implementsRunnable{
 
   privateintticket =10;
 
   publicvoidrun(){
 
      for(inti = 0; i<500; i++){
 
         if(this.ticket>0){
 
               System.*out*.println(Thread.*currentThread*().getName()
+ "賣票---->"+ (this.ticket--));
 
         }
 
      }
 
   }
 
}
 
public classRunnableDemo {
 
   publicstaticvoidmain(String[] args) {
 
      // 設計三個線程
 
      MyThread1 mt = newMyThread1();
 
      Thread t1 = newThread(mt, "一號窗口");
 
      Thread t2 = newThread(mt, "二號窗口");
 
      Thread t3 = newThread(mt, "三號窗口");
 
      t1.start();
 
      t2.start();
 
      t3.start();
 
   }
 
}

運行結果:

三號窗口賣票---->10

三號窗口賣票---->7

三號窗口賣票---->6

三號窗口賣票---->5

三號窗口賣票---->4

三號窗口賣票---->3

一號窗口賣票---->8

二號窗口賣票---->9

一號窗口賣票---->1

三號窗口賣票---->2

為什么兩個程序的結果不同呢?

第1個程序,相當于拿出三件事即三個賣票10張的任務分別分給三個窗口,他們各做各的事各賣各的票各完成各的任務,因為MyThread繼承Thread類,所以在new MyThread的時候在創建三個對象的同時創建了三個線程。

第2個程序,相當于是拿出一個賣票10張得任務給三個人去共同完成,new MyThread相當于創建一個任務,然后實例化三個Thread,創建三個線程即安排三個窗口去執行。

用圖表示如下:

淺談Java的兩種多線程實現方式

通過上面的分析,我們發現這兩種多線程有兩大區別:

(1)Thread方式是繼承;Runnable方式是實現接口。

(2)Thread方式是多個線程分別完成自己的任務,即數據獨立;Runnable方式是多個線程共同完成一個任務,即數據共享。

大多數情況下,如果只想重寫run() 方法,而不重寫其他 Thread 方法,那么應使用 Runnable 接口。這很重要,因為除非程序員打算修改或增強類的基本行為,否則不應為該類(Thread)創建子類。

二、隱藏的問題

在第二種方法中,由于3個Thread對象共同執行一個Runnable對象中的代碼,因此可能會造成線程的不安全,比如可能ticket會輸出-1(如果我們System.out....語句前加上線程休眠操作,該情況將很有可能出現)。

這種情況的出現是由于,一個線程在判斷ticket為1>0后,還沒有來得及減1,另一個線程已經將ticket減1,變為了0,那么接下來之前的線程再將ticket減1,便得到了-1。

這就需要加入同步操作(即互斥鎖),確保同一時刻只有一個線程在執行每次for循環中的操作。

而在第一種方法中,并不需要加入同步操作,因為每個線程執行自己Thread對象中的代碼,不存在多個線程共同執行同一個方法的情況。

程序1:

?
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
52
53
54
55
56
57
58
59
60
package z;
 
class MyThread1 implementsRunnable{
 
   privateintticket = 10;
 
   publicvoidrun(){
 
      for(inti = 0; i<500; i++){
 
         if(this.ticket>0){
 
            try{
 
               Thread.*sleep*(100);
 
               System.*out*.println(Thread.*currentThread*().getName()
+ "賣票---->"+ (this.ticket--));
 
            }catch(Exception e) {
 
               e.printStackTrace();
 
            }
 
         }
 
      }
 
   }
 
}
 
 
 
public classRunnableDemo {
 
 
 
   publicstaticvoidmain(String[] args) {
 
      // 設計三個線程
 
      MyThread1 mt = newMyThread1();
 
      Thread t1 = newThread(mt, "一號窗口");
 
      Thread t2 = newThread(mt, "二號窗口");
 
      Thread t3 = newThread(mt, "三號窗口");
 
      t1.start();
 
      t2.start();
 
      t3.start();
 
   }
 
}

運行結果:

一號窗口賣票---->10

二號窗口賣票---->10

三號窗口賣票---->9

一號窗口賣票---->8

三號窗口賣票---->7

二號窗口賣票---->8

一號窗口賣票---->6

三號窗口賣票---->4

二號窗口賣票---->5

三號窗口賣票---->3

二號窗口賣票---->2

一號窗口賣票---->3

二號窗口賣票---->1

三號窗口賣票---->-1

一號窗口賣票---->0

程序2:

?
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
52
53
package z;
 
class MyThread1 implementsRunnable{
 
   privateintticket = 1000;
 
   publicvoidrun(){
 
      for(inti = 0; i<5000; i++){
 
         synchronized(this) {
 
            if(this.ticket>0){
 
               System.*out*.println(Thread.*currentThread*().getName()+"賣票---->"+(this.ticket--));
 
            }
 
         }
 
      }
 
   }
 
}
 
 
 
public classRunnableDemo {
 
 
 
   publicstaticvoidmain(String[] args) {
 
      // 設計三個線程
 
      MyThread1 mt = newMyThread1();
 
      Thread t1 = newThread(mt, "一號窗口");
 
      Thread t2 = newThread(mt, "二號窗口");
 
      Thread t3 = newThread(mt, "三號窗口");
 
      t1.start();
 
      t2.start();
 
      t3.start();
 
   }
 
}

運行結果:

一號窗口賣票---->10

一號窗口賣票---->9

一號窗口賣票---->8

一號窗口賣票---->7

一號窗口賣票---->6

一號窗口賣票---->5

一號窗口賣票---->4

一號窗口賣票---->3

一號窗口賣票---->2

一號窗口賣票---->1

注意,這里的10張票都是一號窗口賣出的。這是因為用了synchronized并且票數太少了,在t1對this對象鎖定的時間內,10張票就已經被賣完了。輪到t2或t3鎖定this對象時,已經無票可賣了。如果票數多一點,比如有幾萬張,就可以看到三個窗口都參與了賣票。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.jianshu.com/p/098ee2a89e6f

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 神马影院一区二区三区 | 亚洲成人在线观看视频 | 亚洲国产一区二区三区四区 | 91视频导航 | 亚洲一区中文字幕在线观看 | 欧洲精品| 国产毛片在线 | 99视频在线 | 日韩另类 | 久播播av| 91精品国产综合久久久久 | 国产精品视频入口 | 国产精品国色综合久久 | 国产精久久久 | 日韩资源 | 中文字幕av一区二区三区 | 亚洲综合大片69999 | 亚洲欧洲在线观看 | 欧美在线观看一区二区 | 欧洲精品码一区二区三区免费看 | 亚洲国产视频网站 | 久久a国产| 久久黄色 | 久久精品国产一区二区电影 | 国产三级网站 | 免费成人av片 | 久久久精品一区二区 | www.伊人 | 一呦二呦三呦国产精品 | 亚洲精品日韩激情在线电影 | 精品在线一区二区三区 | 国产精品免费在线 | 黄色三级视频 | 黄色一区二区三区 | 国产三级精品在线 | 欧美人成在线观看 | 久草免费在线视频 | 青青草国产精品 | 黄色av网站在线观看 | 成人黄色电影小说 | 亚洲国产成人精品久久 |