多執行緒 -- 多執行緒的實現
阿新 • • 發佈:2018-11-19
多執行緒----程序與執行緒
概念及二者區別與聯絡
- 程序就是作業系統中一個程式的執行週期
- 執行緒:一個程式同時執行多個任務;通常來講,每一個任務就稱為一個執行緒
- 建立,撤銷一個執行緒比啟動,撤銷一個程序開銷要小得多
- 一個程序中所有的執行緒共享該程序的所有資源
- 沒有程序就沒有執行緒,程序一旦終止,執行緒也將不存在
- 執行緒依託程序提供的資源,無法獨立申請作業系統資源
多執行緒的實現
繼承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());
}
}