1. 程式人生 > >Java多線程詳解

Java多線程詳解

區別 程序代碼 jvm 有一個 睡覺 原因 dde 技術 ava

內容:

1、什麽是多線程

2、兩種創建線程方式

3、線程的匿名內部類使用

4、線程安全

5、線程同步

6、Lock接口

1、什麽是多線程

學習多線程之前,我們先要了解幾個關於多線程有關的概念。

進程:進程指正在運行的程序。確切的來說,當一個程序進入內存運行,即變成一個進程,

進程是處於運行過程中的程序,並且每個進程都具有一定獨立功能

線程:線程是進程中的一個執行單元,來完成進程中的某個功能

進程實例:

技術分享圖片

線程實例:

技術分享圖片

一個進程中至少有一個線程。一個進程中是可以有多個線程的,這個應用程序可以稱之為多線程程序

簡而言之:一個程序運行後至少有一個進程,一個進程中可以包含多個線程

什麽是多線程呢?即就是一個程序中有多個線程在同時執行。

通過下圖來區別單線程程序與多線程程序的不同:

單線程程序:

  • 若有多個任務只能依次執行。當上一個任務執行結束後,下一個任務開始執行。
  • 去網吧上網,網吧只能讓一個人上網,當這個人下機後,下一個人才能上網。

多線程程序:

  • 若有多個任務可以同時執行。
  • 去網吧上網,網吧能夠讓多個人同時上網。

主線程(單線程程序):

回想我們以前學習中寫過的代碼,當我們在dos命令行中輸入java空格類名回車後,啟動JVM,並且加載對應的

class文件。虛擬機並會從main方法開始執行我們的程序代碼,一直把main方法的代碼執行結束。如果在執行過程

遇到循環時間比較長的代碼,那麽在循環之後的其他代碼是不會被馬上執行的。如下代碼演示:

 1 class Person{
 2     String name;
 3     Person(String name){
 4         this.name = name;
 5     }
 6     void music()    {
 7         for (int i=1;i<=20;i++ )        {
 8             System.out.println(name+"在聽第"+i+"首歌");
 9         }
10     }
11     void
eat() { 12 for (int i=1;i<=20;i++ ) { 13 System.out.println(name+"在吃第"+i+"口飯"); 14 } 15 } 16 17 } 18 19 class MainThreadDemo{ 20 public static void main(String[] args) { 21 Person p = new Person("xxx"); 22 p.music(); 23 p.eat(); 24 System.out.println("聽完歌吃完飯了,該睡覺了zzZZ~~~"); 25 } 26 }

若在上述代碼中music方法中的循環執行次數很多,這時在p.music();下面的代碼是不會馬上執行的,並且在dos窗口

會看到不停的輸出”xxx在吃第幾口飯”,這樣的語句。為什麽會這樣呢?

原因:

jvm啟動後,必然有一個執行路徑(線程)從main方法開始的,一直執行到main方法結束,這個線程在java中稱之為

主線程(main線程)。當程序的主線程執行時,如果遇到了循環而導致程序在指定位置停留時間過長,則無法馬上

執行下面的程序,需要等待循環結束後能夠執行。

那麽,能否實現一個主線程負責執行其中一個循環,再由另一個線程負責其他代碼的執行,最終實現多部分代碼同時執行的效果?

答:當然能夠實現同時執行,只要通過Java中的多線程技術來解決該問題。

Java多線程詳解