1. 程式人生 > >多執行緒 -- 多執行緒的實現

多執行緒 -- 多執行緒的實現

多執行緒----程序與執行緒

概念及二者區別與聯絡

  • 程序就是作業系統中一個程式的執行週期
  • 執行緒:一個程式同時執行多個任務;通常來講,每一個任務就稱為一個執行緒
  • 建立,撤銷一個執行緒比啟動,撤銷一個程序開銷要小得多
  • 一個程序中所有的執行緒共享該程序的所有資源
  • 沒有程序就沒有執行緒,程序一旦終止,執行緒也將不存在
  • 執行緒依託程序提供的資源,無法獨立申請作業系統資源

多執行緒的實現

繼承Thread類實現多執行緒

  • java.lang.Thread是執行緒操作的核心類
  • 新建一個執行緒最簡單的方法就是直接繼承Thread類而後覆寫run()方法
  • 但是無論哪種方式實現多執行緒,本質上啟動一定呼叫Thread類提供的start()方法
  • 執行緒的start()方法只能呼叫一次
多次呼叫會報錯java.lang.IllegalThreadStateException

執行緒主要呼叫流程:
start(java方法)  -> start0(JVM)  ->  進行資源排程  ,系統分配(JVM) 
 ->  run(java方法)執行執行緒的具體操作任務
  • 程式碼展示如下:
class MyThread extends Thread {
    private String title;

    public MyThread(String title) {//執行緒主體類
        this.title = title;
    }
    public void run(){//所有執行緒從此處開始
        for(int i = 0;i<10;i++){
            System.out.println(this.title+",i =" +i);
        }
    }
}
public class Test{
    public static void main(String[] args) {
        MyThread myThread = new MyThread("張三");
        MyThread myThread1 = new MyThread("李四");
        MyThread myThread2 = new MyThread("王一");
        myThread.start();
        myThread1.start();
        myThread2.start();
    }
}

實現Runnable介面來實現多執行緒

  • 用介面實現之後,解決了單繼承侷限問題;但是沒有start()方法被繼承了。那麼此時就需要關注Thread類提供的構造方法public Thread(Runnable target)
class MyThread implements Runnable{
    private String title;
    public MyThread(String title) {//執行緒主體類
        this.title = title;
    }
    public void run(){//所有執行緒從此處開始
        for(int i = 0;i<10;i++){
            System.out.println(this.title+",i =" +i);
        }
    }
}
public class Test{
    public static void main(String[] args) {
        MyThread myThread = new MyThread("張三");
        MyThread myThread1 = new MyThread("李四");
        MyThread myThread2 = new MyThread("王一");
        new Thread(myThread).start();
        new Thread(myThread1).start();
        new Thread(myThread2).start();
    }
}
Thread與Runnable關係與區別
  • Thread類與自定義執行緒類(實現了Runnable介面),是一個典型的代理設計模式;Thread類負責輔助真實業務操作(資源排程,建立執行緒並啟動);自定義執行緒負責真實業務的實現(run方法具體做啥事)
  • 使用Runnable介面實現的多執行緒程式類,可以更好的描述共享的概念

Callable實現多執行緒

  • 從JDK1.5開始追加了新的開發包:java.uti.concurrent(這個開發包主要是進行高併發程式設計使用的),包含很多在高併發操作中會使用的類。這個包裡定義一個新的介面Callable
  • Runnable中的run()方法沒有返回值
  • 因此,當執行緒有返回值時,只能利用Callable來實現多執行緒
  • 實現Callable介面,覆寫call()方法,有返回值V call() throws Exception;
  • 使用Callable定義執行緒主體類
class MyThread implements Callable<String>{
    private int ticket = 10;
    public String call() throws Exception{
        while(this.ticket > 0){
            System.out.println("剩餘票數:"+this.ticket--);
        }
        return "票買完了。";
    }
}
  • 不管何種情況,如果要啟動多執行緒,只有Thread類中的start()方法
  • 而啟動並取得多執行緒的執行結果
public class Test{
    public static void main(String[] args)throws InterruptedException,ExecutionException {
        FutureTask<String> task =  new FutureTask<>(new MyThread());
        new Thread(task).start();
        new Thread(task).start();
        System.out.println(task.get());
    }
}