一, java多線程 線程與進程 進程: 程式(任務)的執行過程,擁有資源(共用記憶體,共用資源)和線程(一個或者多個,至少一個)。 例如:打開任務管理器,qq,chrome,都屬於進程。 線程: 系統中最小的執行單元,同一進程中有多個線程,線程共用進程的資源。 例如:qq的聊天發送消息。 單線程:程 ...
一, java多線程----線程與進程
進程: 程式(任務)的執行過程,擁有資源(共用記憶體,共用資源)和線程(一個或者多個,至少一個)。 例如:打開任務管理器,qq,chrome,都屬於進程。
線程: 系統中最小的執行單元,同一進程中有多個線程,線程共用進程的資源。 例如:qq的聊天發送消息。
單線程:程式中只有一個線程,實際上主方法就是一個主線程。
多線程:程式中運行多個任務, 目的是更好的使用cpu資源。
二,java多線程----線程的實現
簡單一句話來說,繼承Thead類或者實現Runnable這個介面,然後重寫裡面的run方法。
繼承Thead類
1 public class MyThead extends Thread{ 2 3 private String name; 4 public MyThead(String name) { 5 this.name = name; 6 } 7 @Override 8 public void run() { 9 for (int i = 0; i < 1000; i++) { 10 System.out.println(name+"------"+i); 11 } 12 } 13 }
實現Runnable介面
1 public class MyRunnable implements Runnable{ 2 3 private String name; 4 public MyRunnable(String name) { 5 this.name = name; 6 } 7 @Override 8 public void run() { 9 for (int i = 0; i < 1000; i++) { 10 System.out.println(name+"----"+i); 11 } 12 13 } 14 15 }
啟動線程
1 public class TheadDemo { 2 3 public static void main(String[] args) { 4 MyThead t1 = new MyThead("t1"); 5 MyThead t2 = new MyThead("t2"); 6 7 t1.start(); 8 t2.start(); 9 10 MyRunnable r1 = new MyRunnable("r1"); 11 MyRunnable r2 = new MyRunnable("r2"); 12 13 Thread t3 = new Thread(r1); 14 Thread t4 = new Thread(r2); 15 16 t3.start(); 17 t4.start(); 18 } 19 }
三,java多線程----線程的狀態
創建狀態:創建多線程對象。
就緒狀態: 調用start(),等待cpu調用。
運行狀態: 執行run()。
阻塞狀態:暫時停止執行,將資源交給其他線程使用。
終止狀態:線程結束。
四,java多線程----常用的方法(thead類裡面)
獲取當前線程的對象 currentThread()
得到線程名稱 getName()
判斷線程是否運行 isAlive()
線程的強行運行 join() 例如:倆個線程t1,t2, 當在t1執行的時候,t2調用join()方法,t1暫停不執行,t2執行,執行完成後,釋放資源,t1接著執行。
線程的休眠 sleep() 例如:t1每執行一次,等待5秒 t1.sleep(5000)
線程的禮讓 yield() 例如:倆個線程t1,t2, 當在t1執行的時候,t1調用yield()方法,t1暫停不執行,t2執行,執行完成後,釋放資源,t1接著執行。
五,java多線程---- 優先順序
MIN_PRIORITY 小
MAX_PRIORITY 大
NORM_PRIORITY 正常狀態
如果什麼都不設置,預設是5
線程的優先順序其實可以影響線程的執行順序,這裡的影響是可能性的,有可能影響到了,也有可能沒有 。
六,java多線程----同步與死鎖
同步的倆種方式,同步代碼塊,同步方法
同步代碼塊格式
synchronized( 同步的對象){
同步的代碼
};
同步方法
public synchronized void 方法名(){
同步的代碼
};
例子:java代碼實現火車站三個視窗進行賣票,如果沒有同步的話,會怎麼樣,同步的話,又會出現怎麼的情空呢?
沒有同步的代碼
1 class MyRun implements Runnable{ 2 //火車站有5張票 3 private int ticket = 5; 4 @Override 5 public void run() { 6 for (int i = 0; i < 10; i++) { 7 if(ticket > 0){ 8 try { 9 Thread.sleep(500); 10 } catch (InterruptedException e) { 11 e.printStackTrace(); 12 } 13 System.out.println("車票:"+ticket--); 14 } 15 } 16 } 17 } 18 public class TheadDemo { 19 20 public static void main(String[] args) { 21 MyRun run = new MyRun(); 22 Thread t1 = new Thread(run, "視窗一"); 23 Thread t2 = new Thread(run, "視窗二"); 24 Thread t3 = new Thread(run, "視窗三"); 25 26 t1.start(); 27 t2.start(); 28 t3.start(); 29 } 30 }
結果;
同步代碼塊實現代碼
1 class MyRun implements Runnable{ 2 //火車站有5張票 3 private int ticket = 5; 4 @Override 5 public void run() { 6 for (int i = 0; i < 10; i++) { 7 synchronized (this) { 8 if(ticket > 0){ 9 try { 10 Thread.sleep(500); 11 } catch (InterruptedException e) { 12 e.printStackTrace(); 13 } 14 System.out.println("車票:"+ticket--); 15 } 16 } 17 } 18 } 19 } 20 public class TheadDemo { 21 22 public static void main(String[] args) { 23 MyRun run = new MyRun(); 24 Thread t1 = new Thread(run, "視窗一"); 25 Thread t2 = new Thread(run, "視窗二"); 26 Thread t3 = new Thread(run, "視窗三"); 27 28 t1.start(); 29 t2.start(); 30 t3.start(); 31 } 32 }
結果:
結論:在多線程的情況下,為了確保資源準確,或者說數據的準確,我們必須使用線程同步。也就是說加synchronized關鍵字
死鎖的概念-------所謂死鎖是指多個進 程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都將無法向前推進。
http://c.biancheng.net/cpp/html/2604.html 可以看看該文章,裡面解釋的很清楚。
七,java多線程----線程的生命周期