JAVA 10(多线程)
生活随笔
收集整理的這篇文章主要介紹了
JAVA 10(多线程)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
創建線程: 通過對java.lang包的查找,繼承Thread類可以創建線程 1,建立類繼承Thread類 2,復寫Thread中的ran方法。 3,調用線程的start()方法,該方法的作用是,啟動線程,調用ran方法。 public class Test { public static void main(String args[]) { Demo a= new Demo(); a.start(); for(int x=0;x<=100;x++) System.out.println("hello word"); } } class Demo extends Thread { public void ran() { for(int x=0;x<=100;x++) System.out.println("Demo ran"); } } 兩個輸出會交替出現。 發現運行結果每次都不同 因為多個線程都在獲取cpu的使用權,cpu執行到誰,誰就運行,在某一時刻,只能有一個程序在運行(多核除外)cpu在做著快速切換,已達到看上去是在同時運行。 多線程特性:隨機性,誰搶到誰執行,至于執行多長時間,cpu說的算。 為什么要覆蓋ran方法 thread類用于描述線程。 該類定義了用于存儲要運行的代碼,這些代碼就存儲在ran方法中。 ran() 和 start() 區別 只寫ran()線程沒有被創建,編程了單線程程序。會順序執行,輸出不是隨機的。 ? 線程運行過程中的狀態: 線程對象的名稱: 每個線程都有默認名稱。 Thread-編號 ? //該編號從0開始 線程名稱可以提供 線程.getName() ?方法獲得 currentThread() :獲取當前運行的線程對象 getName():獲取線程名稱 買票程序舉例: public class Test { public static void main(String args []) { Ticket t1 = new Ticket(); Ticket t2 = new Ticket(); Ticket t3 = new Ticket(); Ticket t4 = new Ticket(); Ticket t5 = new Ticket(); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); } } class Ticket extends Thread { private static int tick=100; //靜態,所有對象公用一個票數。 public void run() { if(tick>0) System.out.println(currentThread().getName()+"sale:"+tick--); } } 第二種創建進程的方法 ? 實現runable接口 步驟: 1,定義類,實現runnable接口 2,覆蓋runnable中的run()方法 3,通過Thread;類建立線程對象 4,將Runnable接口對象作為實際參數傳遞給Thread類的構造函數 5,調用Thread類的start方法開啟線程并調用Runnable子類中的run方法 實現方式和前一種方法的區別: 實現方式好處在于:避免了單繼承的局限性。 在定義線程時,建議使用實現方式。 繼承Thread類:線程代碼存放在Thread子類對象run方法中 實現Runnable:線程代碼存放在接口的子類對象的run中 在此例中ticket也不用static了,因為只建立了一個對象 睡眠: try {Thread.sleep(10);} catch(Exception e) { } public class Test { public static void main(String args []) { Ticket t = new Ticket(); Thread t1 =new Thread(t); Thread t2 =new Thread(t); Thread t3 =new Thread(t); Thread t4 =new Thread(t); t1.start(); t2.start(); t3.start(); t4.start(); } } class Ticket implements Runnable { private int tick = 100; public void run() { while(true) if(tick>0) { System.out.println("sale"+tick--); } } } 安全問題: 以下代碼會打印 ?0,-1,-2號票 產生問題原因: 當多條語句在操作同一個線程共享數據時,一個線程對多條語句只執行了一部分,另一個線程1參與進來執行,導致共享數據出現錯誤。? 解決辦法:對多條操作共享數據的語句,只能讓讓一個線程都執行完,在執行過程中,其他線程不可以參與執行。? java對于多線程的安全問題提供了專業的解決方式,就是同步代碼塊。會保證該代碼塊內的代碼被全部執行再切換線程。 格式: synchronized(對象) { 需要被同步的代碼 } public class Test { public static void main(String args []) { Ticket t = new Ticket(); Thread t1 =new Thread(t); Thread t2 =new Thread(t); Thread t3 =new Thread(t); Thread t4 =new Thread(t); t1.start(); t2.start(); t3.start(); t4.start(); } } class Ticket implements Runnable { private int tick = 100; public void run() { while(true) if(tick>0) { try {Thread.sleep(10);} catch(Exception e) { } System.out.println("sale"+tick--); } } } 修改安全問題后的代碼 public class Test { public static void main(String args []) { Ticket t = new Ticket(); Thread t1 =new Thread(t); Thread t2 =new Thread(t); Thread t3 =new Thread(t); Thread t4 =new Thread(t); t1.start(); t2.start(); t3.start(); t4.start(); } } class Ticket implements Runnable { Object obj= new Object(); private int tick = 100; public void run() { while(true) { synchronized(obj) { if(tick>0) { try {Thread.sleep(10);} catch(Exception e) { } System.out.println("sale"+tick--); } } } } } 如何找到安全問題/同步的前提: 1,明確哪些代碼是多線程運行的代碼。 2,明確共享數據。 3,明確多線程代碼中哪些語句是操作共享數據的。 同步函數: 同步有兩種,1代碼塊,2同步函數 用synchronized修飾函數即可。 同步代碼塊使用的鎖時obj 同步函數的鎖: 同步函數使用的所時this ?也就是調用該函數的實體。 如果同步函數被靜態修飾后,使用的鎖是該類對應的class,就是類名點class 。 ? Ticket.class 懶漢式 死鎖: ? 兩個鎖: 同步中嵌套同步,鎖卻不同,恰好停止在某位置,會造成死鎖。 要避免死鎖。 public class Test { public static void main(String args []) { Thread t1 = new Thread(new Deadlock(true)); Thread t2 = new Thread(new Deadlock(false)); t1.start(); t2.start(); } } class Deadlock implements Runnable { private boolean flag; Deadlock(boolean flag) { this.flag = flag; } public void run() { if(flag) { while(true) { synchronized(Mylock.locka) { System.out.println("if lock a"); synchronized(Mylock.lockb) { System.out.println("if lockb"); } } } } else { while(true) { synchronized(Mylock.lockb) { System.out.println("else lockb"); synchronized(Mylock.locka) { System.out.println("else locka"); } } } } } } class Mylock { static Object locka = new Object(); static Object lockb = new Object(); }
?
轉載于:https://www.cnblogs.com/hitxx/p/4675974.html
總結
以上是生活随笔為你收集整理的JAVA 10(多线程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 元启发式算法之一:蝙蝠算法BA
- 下一篇: hdu 5310 Souvenir