多執行緒兩種實現方式的區別Thread Runnable
阿新 • • 發佈:2019-01-08
多執行緒兩種實現方式的區別
多執行緒的兩種實現方式 Thread Runnable 兩者的區別
首先:使用Runnable介面與Thread類相比較,解決了單根繼承的定義侷限性,所以不管後面的區別和聯絡是什麼,至少這一點上就已經下了死定義– 如果要使用一定是用Runnable介面!
觀察Thread類的定義
public class Thread extendsObjectimplements Runnable
發現Thread類實現了Runnable介面,那麼程式就變成了以下的形式。
整個結構看起來很像是代理設計模式,如果是代理設計模式,客戶端呼叫的代理類的方法也應該是接口裡提供的方法,那麼也應該是run()才對。
使用Runnable介面可以比Thread類能夠更好的描述出資料共享的概念。此時的資料共享指的是多個執行緒訪問同一資源的操作
示例:每一個執行緒物件都必須通過start啟動
class MyThread extends Thread{ private int titcket = 10; @Override public void run() { for (int i = 0; i < 100; i++) { if (this.titcket > 0){ System.out.println("賣票,ticket = "+ this.titcket --); } } } } public class TestThreadRunnable { public static void main(String[] args) { //由於MyThread類有start()方法,所以可以直接啟動MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); MyThread myThread3 = new MyThread();myThread1.start(); myThread2.start(); myThread3.start(); } }
本程式聲明瞭三個MyThread類的物件,並且分別呼叫了三次start()方法,啟動執行緒物件。但是發現最終的結果是:每一個執行緒物件都在賣各自的10張票。
此時並不存在資料共享的概念。
示例:利用Runnable來實現
class MyThread implements Runnable{ private int titcket = 10; @Override public void run() { for (int i = 0; i < 100; i++) { if (this.titcket > 0){ System.out.println("賣票,ticket = " + this.titcket --); } } } } public class TestThreadRunnable { public static void main(String[] args) { //由於MyThread類有start()方法,所以可以直接啟動MyThread myThread = new MyThread(); new Thread(myThread).start(); new Thread(myThread).start(); new Thread(myThread).start(); } }
此時也屬於三個執行緒物件,區別是:這個三個執行緒物件都直接佔用了一個MyThread類的物件引用,也就是說這三個執行緒物件都直接訪問同一個資料資源。
1. 請解釋Thread類與Runnable介面實現多執行緒的區別
2. 請解釋多執行緒兩種實現方式的區別
·Thread類是Runnable介面實現多執行緒可以避免單根繼承侷限性;
Runnable介面實現的多執行緒可以比Thread類實現的多執行緒更加清楚的描述資料共享的概念;
3. 請寫出多執行緒兩種實現操作。
·把Thread類繼承的方式和Runnable介面實現的方式程式碼都寫出來