1. 程式人生 > >(三)多執行緒說學逗唱:村口的老R頭是個掃地僧(Runnable)

(三)多執行緒說學逗唱:村口的老R頭是個掃地僧(Runnable)

  • 上一篇我們講到Thread這個類以及簡單地說了下執行緒執行的隨機性,相信大家對執行緒的使用有了不小的瞭解…
    在這裡插入圖片描述

  • 繼承Thread介面是實現多執行緒的方式之一我相信你已經將這內功熟記於心,這一招式也外化於形了,但是這種方式在任何情況下都能夠派上用場的嗎??非也,他可不是程咬金的三板斧、萬金油…對Java繼承有一定了解的玩家都知道,在Java中有一個很大的特點,那就是:單根繼承,也就是說你只能有一個爸爸,咱不能學呂布做三姓家奴不是。如果打算建立的執行緒類已經繼承了某一個類了,這時候就不能夠再次繼承Thread類了(是不是很悲傷…),因此遇到這種情況必然需要變換招式了,Java就提供了這第二種招式,實現Runnable介面,瞧著,這老R頭正在村口等著你嘞…
    在這裡插入圖片描述

  • 前面一篇文中我簡單列舉了下Thread的構造方法,這裡呢我就著重帶大家看看上圖中的兩個,很顯然的這兩個都可以傳入Runnable介面,這說明建構函式支援傳入一個實現了Runnable介面的物件。這樣一來,既然已經繼承了類的物件無法繼承Thread類,那麼換一個思維,先用一個類實現Runnable介面,在將該類作為引數傳入Thread,這不就間接地建立了一個執行緒類嗎!!設計師真是個天才。我們接下來來看Runnablel介面,該介面只有一個抽象方法run,不用多說實現Runnable介面必然要實現run方法
    在這裡插入圖片描述

package day01;
/**
 * 
* @ClassName: UseRunnable
* @Description: 學習建立執行緒的第二種方式:實現Runnable介面,
* 	同時學習一些執行緒中的細節:
* 		1)實現Runnable介面能夠彌補java單根繼承的短板,讓已經繼承了其他類的類也能夠實現多執行緒
* 		2)Thread類也實現了Runnable介面,也就是說Thread(Runnable target)該建構函式不但可以傳入
* 			實現了Runnable介面的類,也可以傳入一個Thread類,能夠將Thread類中的run方法交由其它的執行緒進行排程。
* @author Jian.Wang
* @date 2018年12月6日
*
 */
public class UseRunnable {
	private static final String MY_RUNNABLE_CLASS_NAME = "runnable_thread";
	private static final String MY_THREAD_CLASS_NAME = "thread_thread";
	
	public static void main(String[] args) {
		MyRunnable myRunnable = new MyRunnable();
		MyThreadTest myThreadTest = new MyThreadTest();
		
		Thread runnable_thread = new Thread(myRunnable,MY_RUNNABLE_CLASS_NAME);
		Thread thread_thread = new Thread(myThreadTest,MY_THREAD_CLASS_NAME);
		
		runnable_thread.start();
		thread_thread.start();
		System.out.println("Main:" + Thread.currentThread().getName());
	}

}

/**
 * 
* @ClassName: MyRunnable
* @Description: 執行緒類,通過實現Runnable介面建立
* @author Jian.Wang
* @date 2018年12月6日
*
 */
class MyRunnable implements Runnable{
	@Override
	public void run() {
		System.out.println("MyRunnable: 這是一個實現了Runnable介面的多執行緒類......");
		System.out.println("MyRunnable:" + Thread.currentThread().getName());
	}
	
}

/**
 * 
* @ClassName: MyThreadTest
* @Description: 執行緒類,通過繼承Thread類建立
* @author Jian.Wang
* @date 2018年12月6日
*
 */
class MyThreadTest extends Thread{
	@Override
	public void run() {
		System.out.println("MyThred: 這是一個繼承了Thread類的多執行緒類.......");
		System.out.println("MyThred:" + Thread.currentThread().getName());
	}
	
}


  • MyRunnable 類實現了Runnable介面,並實現了run方法,這裡方法中只是簡單地列印了下一條一句話和該執行緒的名字,然後在UseRunnable 類中通過MyRunnable myRunnable = new MyRunnable()建立了MyRunnable 實體,接著呼叫Thread的夠著方法Thread(myRunnable,MY_RUNNABLE_CLASS_NAME)將Runnable的實體物件傳入進去,並直接給執行緒一個名稱,隨後呼叫start()方法啟動執行緒,這樣第二種實現多執行緒的方式就實現了,是不是特別簡單??
  • 有些看官可能就會問了,上面程式碼中還有一些程式碼是什麼意思呢?別急,等我慢慢道來,首先先看我給大家看過的圖。
    在這裡插入圖片描述
  • 說實話,本學渣也是第一次注意到Thread.java類也實現了Runnable介面,那就意味著夠著函式Thread(Runnable target)不光可以傳入Runnable介面的物件,還可以傳入一個Thread類的物件,這樣一來就完全可以將一個Thread物件中的run()方法交由其他執行緒進行呼叫。於是我建立了MyThreadTest 類繼承了Thread,以上一種同樣的方式作為引數傳遞,放在一起進行比較,得出了下面的執行結果,哈哈,收穫了新東西(開心)。
    在這裡插入圖片描述