當一個程序運行時,內部可能包含了多個順序執行流,每個順序執行流就是一個線程。主要以下幾個優點:
Ø 定義Thread的子類,并重寫run方法
Ø 創建Thread子類的實例,即創建了線程對象
Ø 用線程對象的start方法來啟動該線程
1 public class DemoThread extends Thread 2 { 3 PRivate int i; 4 String name; 5 public DemoThread(String name) 6 { 7 super(name); 8 } 9 public void run()10 {11 for(;i<100;i++)12 System.out.println(Thread.currentThread().getName()+"-------"+i);13 14 }15 public static void main(String[] args)16 {17 for(int i=0;i<100;i++)18 {19 System.out.println(Thread.currentThread().getName()+"-----------"+i);20 21 if(i==20)22 {23 new DemoThread("windows1").start();24 new DemoThread("windows2").start();25 }26 }27 }28 }方法二:實現Runnable接口創建線程類Ø 定義Runnable接口的實現類,并重寫該接口的run方法(該方法是該線程的線程執行體)
Ø 創建Runnable實現類的實例,并以此實例作為Thread的target來創建Tread對象
1 public class DemoThread implements Runnable 2 { 3 private int i; 4 public void run() 5 { 6 for(;i<100;i++) 7 System.out.println(Thread.currentThread().getName()+"-------"+i); 8 9 }10 public static void main(String[] args)11 {12 for(int i=0;i<100;i++)13 {14 System.out.println(Thread.currentThread().getName()+"-----------"+i);15 16 if(i==20)17 {18 DemoThread t=new DemoThread();19 new Thread(t,"Windows1").start();20 new Thread(t,"Windows2").start();21 }22 }23 }24 }兩種方法比較:
當兩個或多個線程需要訪問同一共享資源時,需要某種方式來確保資源在某一時刻只被一個線程使用,這個方式稱為“同步“。
為了解決同步問題,java引入同步監視器,代碼塊格式如下:
synchronized (obj){}Java還使用Synchronized關鍵字來修飾某個方法,此方法就無需顯示指定同步監視器。同步鎖:它具有與使用synchronized方法和語句所訪問的隱式監視器鎖相同的一些基本行為和語義,但功能更強大。 使用Lock對象的代碼格式如下: 1 public class X 2 { 3 private final ReentrantLock lock=new ReentrantLock(); 4 public void m() 5 { 6 lock.lock();//加鎖 7 try 8 { 9 //需要保證線程安全的代碼10 }11 finally12 {13 lock.unlock();//釋放鎖14 }15 }16 }17 6、線程的通信Java為了避免輪詢檢測,通過wait()、notify()和notifyAll()方法實現進程內通信的機制。wait():告訴調用線程放棄監控器進入等待模式直到其他線程進入同一監控器并調用notify()方法。notify():喚醒在此同步器上等待的單個線程notifyAll():喚醒在此同步器上等待的所有線程7、線程池線程池在系統啟動時就創建大量空閑的線程,程序將一個Runnable對象傳給線程池,線程池就會啟動一個線程來執行該對象的run方法,當run方法執行結束后該線程不會死亡,而是再次返回線程池中稱為空閑狀態的,等待執行下一個Runnable對象的run方法。使用線程池來執行線程任務的步驟如下: 1 class TestThread implements Runnable 2 { 3 public void run() 4 { 5 for(int i=0;i<50;i++) 6 { 7 System.out.println(Thread.currentThread().getName()+"---"+i); 8 } 9 }10 }11 public class TestMain12 {13 14 public static void main(String[] args)15 {16 // TODO 自動生成的方法存根17 TestThread t=new TestThread();18 ExecutorService pool=Executors.newFixedThreadPool(6);19 pool.submit(new Thread(t));20 pool.submit(new Thread(t));21 pool.shutdown();22 }23 24 }執行結果:
新聞熱點
疑難解答