程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 總結Java中線程的狀況及多線程的完成方法

總結Java中線程的狀況及多線程的完成方法

編輯:關於JAVA

總結Java中線程的狀況及多線程的完成方法。本站提示廣大學習愛好者:(總結Java中線程的狀況及多線程的完成方法)文章只能為提供參考,不一定能成為您想要的結果。以下是總結Java中線程的狀況及多線程的完成方法正文


線程的狀況
線程狀況圖:

解釋:
線程共包含以下5種狀況。
1. 新建狀況(New) : 線程對象被創立後,就進入了新建狀況。例如,Thread thread = new Thread()。
2. 停當狀況(Runnable): 也被稱為“可履行狀況”。線程對象被創立後,其它線程挪用了該對象的start()辦法,從而來啟動該線程。例如,thread.start()。處於停當狀況的線程,隨時能夠被CPU調劑履行。
3. 運轉狀況(Running) : 線程獲得CPU權限停止履行。須要留意的是,線程只能從停當狀況進入到運轉狀況。
4. 壅塞狀況(Blocked) : 壅塞狀況是線程由於某種緣由廢棄CPU應用權,臨時停滯運轉。直到線程進入停當狀況,才無機會轉到運轉狀況。壅塞的情形分三種:
(1) 期待壅塞 -- 經由過程挪用線程的wait()辦法,讓線程期待某任務的完成。
(2) 同步壅塞 -- 線程在獲得synchronized同步鎖掉敗(由於鎖被其它線程所占用),它會進入同步壅塞狀況。
(3) 其他壅塞 -- 經由過程挪用線程的sleep()或join()或收回了I/O要求時,線程會進入到壅塞狀況。當sleep()狀況超時、join()期待線程終止或許超時、或許I/O處置終了時,線程從新轉入停當狀況。
5. 逝世亡狀況(Dead) : 線程履行完了或許因異常加入了run()辦法,該線程停止性命周期。
這5種狀況觸及到的內容包含Object類, Thread和synchronized症結字。這些內容我們會在前面的章節中逐一停止進修。
Object類,界說了wait(), notify(), notifyAll()等休眠/叫醒函數。
Thread類,界說了一些列的線程操作函數。例如,sleep()休眠函數, interrupt()中止函數, getName()獲得線程稱號等。
synchronized,是症結字;它辨別為synchronized代碼塊和synchronized辦法。synchronized的感化是讓線程獲得對象的同步鎖。
在前面具體引見wait(),notify()等辦法時,我們會剖析為何“wait(), notify()等辦法要界說在Object類,而不是Thread類中”。

完成多線程的兩種方法:Thread和Runnable
Runnable 是一個接口,該接口中只包括了一個run()辦法。它的界說以下:

public interface Runnable {
  public abstract void run();
}

Runnable的感化,完成多線程。我們可以界說一個類A完成Runnable接口;然後,經由過程new Thread(new A())等方法新建線程。
Thread 是一個類。Thread自己就完成了Runnable接口。它的聲明以下:
public class Thread implements Runnable {}
Thread的感化,完成多線程。

Thread和Runnable的異同點:
Thread 和 Runnable 的雷同點:都是“多線程的完成方法”。
Thread 和 Runnable 的分歧點:
Thread 是類,而Runnable是接口;Thread自己是完成了Runnable接口的類。我們曉得“一個類只能有一個父類,然則卻能完成多個接口”,是以Runnable具有更好的擴大性。
另外,Runnable還可以用於“資本的同享”。即,多個線程都是基於某一個Runnable對象樹立的,它們會同享Runnable對象上的資本。
平日,建議經由過程“Runnable”完成多線程!
Thread和Runnable的多線程示例
1.Thread的多線程示例
上面經由過程示例更好的懂得Thread和Runnable,自創網上一個例子比擬具有壓服性的例子。// ThreadTest.java 源碼

class MyThread extends Thread{
  private int ticket=10; 
  public void run(){
    for(int i=0;i<20;i++){ 
      if(this.ticket>0){
        System.out.println(this.getName()+" 賣票:ticket"+this.ticket--);
      }
    }
  } 
};

public class ThreadTest { 
  public static void main(String[] args) { 
    // 啟動3個線程t1,t2,t3;每一個線程各賣10張票!
    MyThread t1=new MyThread();
    MyThread t2=new MyThread();
    MyThread t3=new MyThread();
    t1.start();
    t2.start();
    t3.start();
  } 
} 

運轉成果:

Thread-0 賣票:ticket10
Thread-1 賣票:ticket10
Thread-2 賣票:ticket10
Thread-1 賣票:ticket9
Thread-0 賣票:ticket9
Thread-1 賣票:ticket8
Thread-2 賣票:ticket9
Thread-1 賣票:ticket7
Thread-0 賣票:ticket8
Thread-1 賣票:ticket6
Thread-2 賣票:ticket8
Thread-1 賣票:ticket5
Thread-0 賣票:ticket7
Thread-1 賣票:ticket4
Thread-2 賣票:ticket7
Thread-1 賣票:ticket3
Thread-0 賣票:ticket6
Thread-1 賣票:ticket2
Thread-2 賣票:ticket6
Thread-2 賣票:ticket5
Thread-2 賣票:ticket4
Thread-1 賣票:ticket1
Thread-0 賣票:ticket5
Thread-2 賣票:ticket3
Thread-0 賣票:ticket4
Thread-2 賣票:ticket2
Thread-0 賣票:ticket3
Thread-2 賣票:ticket1
Thread-0 賣票:ticket2
Thread-0 賣票:ticket1

成果解釋:
(1) MyThread繼續於Thread,它是自界說個線程。每一個MyThread都邑賣出10張票。
(2) 主線程main創立並啟動3個MyThread子線程。每一個子線程都各自賣出了10張票。

2.Runnable的多線程示例
上面,我們對下面的法式停止修正。經由過程Runnable完成一個接口,從而完成多線程。

// RunnableTest.java 源碼
class MyThread implements Runnable{ 
  private int ticket=10; 
  public void run(){
    for(int i=0;i<20;i++){ 
      if(this.ticket>0){
        System.out.println(Thread.currentThread().getName()+" 賣票:ticket"+this.ticket--);
      }
    }
  } 
}; 

public class RunnableTest { 
  public static void main(String[] args) { 
    MyThread mt=new MyThread();

    // 啟動3個線程t1,t2,t3(它們共用一個Runnable對象),這3個線程一共賣10張票!
    Thread t1=new Thread(mt);
    Thread t2=new Thread(mt);
    Thread t3=new Thread(mt);
    t1.start();
    t2.start();
    t3.start();
  } 
}

運轉成果:

Thread-0 賣票:ticket10
Thread-2 賣票:ticket8
Thread-1 賣票:ticket9
Thread-2 賣票:ticket6
Thread-0 賣票:ticket7
Thread-2 賣票:ticket4
Thread-1 賣票:ticket5
Thread-2 賣票:ticket2
Thread-0 賣票:ticket3
Thread-1 賣票:ticket1

成果解釋:
(1) 和下面“MyThread繼續於Thread”分歧;這裡的MyThread完成了Thread接口。
(2) 主線程main創立並啟動3個子線程,並且這3個子線程都是基於“mt這個Runnable對象”而創立的。運轉成果是這3個子線程一共賣出了10張票。這解釋它們是同享了MyThread接口的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved