| 導購 | 订阅 | 在线投稿
分享
 
 
 

徹底明白Java的多線程-實現多線程及線程的同步

來源:互聯網網民  2008-05-31 12:10:46  評論

一. 實現多線程

1. 虛假的多線程

例1:

public class TestThread { int i=0, j=0; public void go(int flag){ while(true){ try{ Thread.sleep(100); } catch(InterruptedException e){ System.out.println("Interrupted"); } if(flag==0) i++; System.out.println("i=" + i); } else{ j++; System.out.println("j=" + j); } } } public static void main(String[] args){ new TestThread().go(0); new TestThread().go(1); }}

上面程序的運行結果爲:

i=1

i=2

i=3

。。。

結果將一直打印出I的值。我們的意圖是當在while循環中調用sleep()時,另一個線程就將起動,打印出j的值,但結果卻並不是這樣。關于sleep()爲什麽不會出現我們預想的結果,在下面將講到。

2. 實現多線程

通過繼續classThread或實現Runnable接口,我們可以實現多線程

2.1 通過繼續classThread實現多線程

classThread中有兩個最重要的函數run()和start()。

1) run()函數必須進行覆寫,把要在多個線程中並行處理的代碼放到這個函數中。

2) 雖然run()函數實現了多個線程的並行處理,但我們不能直接調用run()函數,而是通過調用start()函數來調用run()函數。在調用start()的時候,start()函數會首先進行與多線程相關的初始化(這也是爲什麽不能直接調用run()函數的原因),然後再調用run()函數。

例2:

public class TestThread extends Thread{ private static int threadCount = 0; private int threadNum = ++threadCount; private int i = 5; public void run(){ while(true){ try{ Thread.sleep(100); } catch(InterruptedException e){ System.out.println("Interrupted"); } System.out.println("Thread " + threadNum + " = " + i); if(--i==0) return; } } public static void main(String[] args){ for(int i=0; i

運行結果爲:

Thread 1 = 5

Thread 2 = 5

Thread 3 = 5

Thread 4 = 5

Thread 5 = 5

Thread 1 = 4

Thread 2 = 4

Thread 3 = 4

Thread 4 = 4

Thread 1 = 3

Thread 2 = 3

Thread 5 = 4

Thread 3 = 3

Thread 4 = 3

Thread 1 = 2

Thread 2 = 2

Thread 5 = 3

Thread 3 = 2

Thread 4 = 2

Thread 1 = 1

Thread 2 = 1

Thread 5 = 2

Thread 3 = 1

Thread 4 = 1

Thread 5 = 1

從結果可見,例2能實現多線程的並行處理。

**:在上面的例子中,我們只用new産生Thread對象,並沒有用reference來記錄所産生的Thread對象。根據垃圾回收機制,當一個對象沒有被reference引用時,它將被回收。但是垃圾回收機制對Thread對象「不成立」。因爲每一個Thread都會進行注冊動作,所以即使我們在産生Thread對象時沒有指定一個reference指向這個對象,實際上也會在某個地方有個指向該對象的reference,所以垃圾回收器無法回收它們。

3) 通過Thread的子類産生的線程對象是不同對象的線程

class TestSynchronized extends Thread{ public TestSynchronized(String name){ super(name); } public synchronized static void prt(){ for(int i=10; i

運行結果爲:

t1 : 0

t1 : 1

t1 : 2

t1 : 0

t1 : 1

t1 : 2

由于是同一個對象啓動的不同線程,所以run()函數實現了synchronized。

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
  一. 實現多線程 1. 虛假的多線程 例1: public class TestThread { int i=0, j=0; public void go(int flag){ while(true){ try{ Thread.sleep(100); } catch(InterruptedException e){ System.out.println("Interrupted"); } if(flag==0) i++; System.out.println("i=" + i); } else{ j++; System.out.println("j=" + j); } } } public static void main(String[] args){ new TestThread().go(0); new TestThread().go(1); }} 上面程序的運行結果爲: i=1 i=2 i=3 。。。 結果將一直打印出I的值。我們的意圖是當在while循環中調用sleep()時,另一個線程就將起動,打印出j的值,但結果卻並不是這樣。關于sleep()爲什麽不會出現我們預想的結果,在下面將講到。 2. 實現多線程 通過繼續class Thread或實現Runnable接口,我們可以實現多線程 2.1 通過繼續class Thread實現多線程 class Thread中有兩個最重要的函數run()和start()。 1) run()函數必須進行覆寫,把要在多個線程中並行處理的代碼放到這個函數中。 2) 雖然run()函數實現了多個線程的並行處理,但我們不能直接調用run()函數,而是通過調用start()函數來調用run()函數。在調用start()的時候,start()函數會首先進行與多線程相關的初始化(這也是爲什麽不能直接調用run()函數的原因),然後再調用run()函數。 例2: public class TestThread extends Thread{ private static int threadCount = 0; private int threadNum = ++threadCount; private int i = 5; public void run(){ while(true){ try{ Thread.sleep(100);  } catch(InterruptedException e){ System.out.println("Interrupted"); } System.out.println("Thread " + threadNum + " = " + i); if(--i==0) return; } } public static void main(String[] args){ for(int i=0; i 運行結果爲: Thread 1 = 5 Thread 2 = 5 Thread 3 = 5 Thread 4 = 5 Thread 5 = 5 Thread 1 = 4 Thread 2 = 4 Thread 3 = 4 Thread 4 = 4 Thread 1 = 3 Thread 2 = 3 Thread 5 = 4 Thread 3 = 3 Thread 4 = 3 Thread 1 = 2 Thread 2 = 2 Thread 5 = 3 Thread 3 = 2 Thread 4 = 2 Thread 1 = 1 Thread 2 = 1 Thread 5 = 2 Thread 3 = 1 Thread 4 = 1 Thread 5 = 1 從結果可見,例2能實現多線程的並行處理。 **:在上面的例子中,我們只用new産生Thread對象,並沒有用reference來記錄所産生的Thread對象。根據垃圾回收機制,當一個對象沒有被reference引用時,它將被回收。但是垃圾回收機制對Thread對象「不成立」。因爲每一個Thread都會進行注冊動作,所以即使我們在産生Thread對象時沒有指定一個reference指向這個對象,實際上也會在某個地方有個指向該對象的reference,所以垃圾回收器無法回收它們。 3) 通過Thread的子類産生的線程對象是不同對象的線程 class TestSynchronized extends Thread{ public TestSynchronized(String name){ super(name); } public synchronized static void prt(){ for(int i=10; i 運行結果爲: t1 : 0 t1 : 1 t1 : 2 t1 : 0 t1 : 1 t1 : 2 由于是同一個對象啓動的不同線程,所以run()函數實現了synchronized。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有