首頁  >  文章  >  类库下载  >  java多執行緒實作方式

java多執行緒實作方式

高洛峰
高洛峰原創
2016-11-02 10:01:441594瀏覽

一、什麼是線程?

    執行緒:程式中單一的順序控制流程。進程內相對獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單位。

    多執行緒:單一程式中同時執行多個執行緒完成不同的工作,稱為多執行緒。

    特性:

    1)輕量級的進程,程式運作流程中可執行的最小單元,執行緒不擁有系統資源,多個執行緒共享進程所擁有的資源。

    2)一個執行緒可以建立另一個線程,多個線程可以並發執行。

    3)多個執行緒在系統運作中搶佔資源,會出現間斷性,我們看到的是並行執行,其實在有先後順序的。

    4)一個行程至少包含一個線程,即主執行緒。

 

二、執行緒有哪些狀態?

java多執行緒實作方式

  執行緒具有:新建,就緒,運行,阻塞,終止五種狀態。

    ①新建:執行緒被創建,沒有執行任何方法,如,Thread th = new Thread()。

    ②就緒:當呼叫執行緒的start方法時,就會觸發執行緒狀態變更為就緒態,等待cpu來呼叫。處於就緒態的執行緒才會被cpu調度,單cpu不是立即執行它。

    ③運作:當cpu發起對此執行緒呼叫時,它就進入了運行態。

    ④阻塞:當執行緒因某些原因,不再擁有cpu使用權,它就會被阻塞。

        阻塞有以下幾種情況:

     1)sleep(long mills):參數為毫秒數,使執行緒在指定的時間內進入阻塞,時間一過,進入就緒態。

     2)suspend() 和 resume():suspend會讓執行緒掛起,必須執行resume進行執行緒的恢復。

     3)yield():與sleep()類似,但是不能由用戶指定暫停多長時間,只能出讓機會給同優先級的線程,且不進入阻塞。如同排隊,前面的人和後面的人交換位置,但是還處在隊伍中。

     4)wait() 和 notify():wait() 使執行緒進入阻塞狀態,有兩種形式,一種指定毫秒數,另一種無參。前者可透過notify()喚起或超過指定時間自動恢復;後者必須透過notify()喚起。

    5)同步阻塞:等待同步鎖定資源。多執行緒競爭同一個資源時,只能一個執行緒獲得鎖,其它的執行緒要等待。

    ⑤終止:執行緒執行完畢,或出現異常,執行緒結束。

     

三、如何建立執行緒?

    java執行緒的實作方式有三種:繼承Thread類別、實作Runnable接口,使用Callable和FutureTask(可以有回傳值)

1、透過整合Thread類別,覆寫run()方法

class MyThThread extends Thread

@Override

public void run() {

for (int i = 0; i

System.out.println(Thread.currentThread().getsName() + " + iName );

}

}

}

 

public class ThreadDemo {

public static void main(String[] args) {

public static void main(String ;

MyThread th1 = new MyThread();

MyThread th2 = new MyThread();

th1.start();

th2.start();

}

Thread-1 0

Thread-0 0

Thread-1 1

Thread-1 2

......

    方法,使執行緒進入就緒狀態,等待CPU分配資源。

    可以看到兩個執行緒並行執行,且隨機獲得CPU。

 

2、試過實作Runnable介面,實作run()方法

class MyThread implements Runnable {

@Override

public void run() {

@Override

public void run() {

; ) {

System.out.println(Thread.currentThread().getName() + " " + i);

}

}

}

. String[] args) {

System.out.println(Thread.currentThread().getName());

MyThread th = new MyThread();

Thread t1 = new Thread(th); = new Thread(th);

t1.start();

t2.start();

}

}

輸出:main

Thread-0 0 0%

1 0

Thread-0 2

......

透過將MyThread實例傳入Thread建構方法實例化Thread,呼叫Thread的start方法,啟動執行緒。

 

ps:繼承Thread和實作Runnable介面有什麼差別呢?

1:前者為單繼承,有局限性,但介面的方式可以實現多個。

2:後者可以實現資源共享。

多執行緒程式設計中,強烈建議使用Runnable

 

3、使用Callable和Future介面建立執行緒。

    具體是建立Callable介面的實作類,並實作clall()方法。

    並使用FutureTask類別來包裝Callable實作類別的對象,並以此FutureTask物件作為Thread物件的target來建立執行緒。

 

class MyCallable implements Callable {

@Override

public Integer call() throws Exception {

public Integer

public class ThreadDemo {

public static void main (String[] args)  {

Callable

myCallable = new MyCallable();//實例化MyCallable

FutureTask

 ft = new FutureTask

(myCallable);//通FutureTask包裝

 

Thread thread = new Thread (ft);//將FutureTask傳入Thread構造,實例化執行緒Integer result = ft.get();//取得回傳值

Integer result = ft.get();//取得回傳值

System. out.println(result);

 

}

}

1)實作Callable介面中的call()方法,這是執行緒要執行的邏輯。

2)FutureTask的get()方法會一直阻塞,直到call()方法執行完畢取到回傳值。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn