Java多線程開發一、二、三、四

轉:-----------------http://softstone.javaeye.com/blog/172911

一、進程、線程
        進程通常是一個程序的實例。但進程是不活動的,必須有一個線程,線程負責執行地址空間中的進程代碼。一個進程可以同時運行多個線程,每個線程擁有自己的堆棧、 CPU 寄存器和 CPU 時間。多個線程共享進程佔有的資源,比如地址空間、動態內存、文件等。
        Java 虛擬機中線程可以粗略的如下表示:
     
      Java Virtual Machine ------------------|-----Thread1---->Local Variables
                                                              |----- Thread1---->Local Variables
      Global Memory································· |----- Thread1---->Local Variables

  可以看到,每個線程有自己的本地變量,同時也共享在 Java 虛擬機中的全局存儲。

 

 

二、創建線程

Java中創建線程又兩種方式,一種是繼承Thread類,一種是實現Runnable接口。對於Thread的繼承類,直接new即可,對於Runnable的實現類,用這個接口的實現類來new一個線程。
代碼示例如下:
//繼承Thread類
public class FirstThread extends Thread {
 
       // 需要繼承run方法
       public void run() {
              try {
                     for (int i = 0; i < 20; i++) {
                            sleep(500);
                            System.out.println(getName());
                     }
              } catch (InterruptedException e) {
                     // 處理線程被終止的情況
                     e.printStackTrace();
              }
 
       }
}
 
//實現Runnable接口
public class SecondThread implements Runnable {
       //Runnable 接口只有一個run方法,必須實現。
       public void run() {       
              try {
                     for (int i = 0; i < 20; i++) {
                            Thread.sleep(400);
                            System.out.println(Thread.currentThread().getName());
                     }
              } catch (InterruptedException e) {
                     // 處理線程被終止的情況
                     e.printStackTrace();
              }
       }
 
}
 
//執行線程
              FirstThread t1 = new FirstThread();
              t1.setName("thread1");
              FirstThread t2 = new FirstThread();
              t2.setName("thread2");
              SecondThread r1 = new SecondThread();
              Thread t3 = new Thread(r1);
              Thread t4 = new Thread(r1);
              t3.setName("thread3");
              t4.setName("thread4");
             
              t1.start();
              t2.start();
              t3.start();
              t4.start();

需要注意,線程的執行必須使用start方法。

 

 

三、線程和對象
在Java中,創建線程是通過創建一個線程對象實現的,這就容易讓人混淆,線程和對象有什麼關係嗎?其實兩者之間沒有關係。
線程是一個動態的概念,一個執行的概念,在Java虛擬機中,線程可以看作是一組語句的執行序列。
對象是一種封裝方式,在Java中,一切都是對象,線程也需要通過對象來表達。Thread class也僅僅是一個對象,可以被其他的線程對象引用,其中的方法既可以被自身表達的線程所執行,也可以被其他的線程所執行。

四、線程的生命週期

線程生命週期

 

 

該圖截自 sun 網站

線程啓動:調用 start ()方法啓動線程

線程運行:線程啓動後運行 run ()方法體內代碼

線程阻塞:線程 sleep() wait

線程結束:自讓運行完畢退出。

 

   

線程的終止
兩種終止方法。
一種是自然終止,run方法執行完退出。比如:
    public void run( ) {


 
        while (!done) {


            ...


 
        }


    }



另一種是調用Thread.interrupt()方法,中斷wait()或Sleep方法,終止線程。
       public void run() {       
              try {
                     for (int i = 0; i < 400; i++) {
                            Thread.sleep(400);
                            System.out.println(Thread.currentThread().getName());
                     }
              } catch (InterruptedException e) {
                     // 處理線程被終止的情況
                     e.printStackTrace();
              }
       }
Thread.interrupt() 方法會導致sleep、join或wait等方法拋出InterruptedException異常,在catch InterruptedException的方法中,退出線程,但是線程在執行任務的時候是不會拋出InterruptedException。
 
其他兩個方法
Thread.interrupted()
檢查線程的中斷狀態,同時清除中斷狀態。
Thread.isInterrupt()
檢查當前線程是否出於中斷狀態。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章