1. 程式人生 > >再談 Java中Runnable和Thread的區別

再談 Java中Runnable和Thread的區別

在面試中老有面試官問這個問題,個人覺得這個問題問的沒有技術,一個死記硬背就能回答的很好。但是更深的回答是什麼了,那就是直接回答原始碼吧。 thread類實現了runnable 介面 ,Runnable就是一個藉口 ,只能我們去實現了才能用 對吧,不管是普通類 還是匿名內部類 ,最大的區別是我們的自己的實現類 沒有辦法啟動執行緒,還是要藉助於thread

結果就出現了執行緒的實現方法

package test8;

/**
 * 方式一
 * @author suifeng
 *
 */
class myThread extends Thread{
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println(Thread.currentThread());
	}
}

/**
 * 方式二
 * @author suifeng
 *
 */
class myRunable implements Runnable{
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println(Thread.currentThread());
	}
}
public class DT {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		new myThread().start();

		new Thread(new myRunable()).start();

		
	}

}

但是不管是什麼方法都需要 thread類的start 方法告訴JVM 啟動執行緒 ,start()方法被 synchronized 修飾 ,在方法塊裡面有呼叫了start0() 方法
public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* Notify the group that this thread is about to be started
         * so that it can be added to the group's list of threads
         * and the group's unstarted count can be decremented. */
        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }

 private native void start0();

start0方法是一個native 方法,直接呼叫的JVM C語言方法,才能啟動一個執行緒 ,所以只有我們有辦法啟動這個start0,就可以自己建立一個執行緒 但是他又是一個私有方法 好吧,先我們來東東手,以後再也不用老是在實現runnable和在start()了
package test8;

import java.lang.Thread.State;
import java.lang.Thread.UncaughtExceptionHandler;

interface Work {

	void work();
}

/**
 * 裝飾模式  
 * @author suifeng
 *
 */
class Mthread implements Runnable {
	Thread dt;
	Work w;

	public Mthread(Work w) {
		dt = new Thread(this);
		this.w = w;
		dt.start();
	}

	public int hashCode() {
		return dt.hashCode();
	}

	public boolean equals(Object obj) {
		return dt.equals(obj);
	}

	public void start() {
		dt.start();
	}

	// ...
	public void run() {
		w.work();
	}

	public final void stop() {
		dt.stop();
	}

	public final void stop(Throwable obj) {
		dt.stop(obj);
	}

	public void interrupt() {
		dt.interrupt();
	}

	public boolean isInterrupted() {
		return dt.isInterrupted();
	}

	public void destroy() {
		dt.destroy();
	}

	public final boolean isAlive() {
		return dt.isAlive();
	}

	public final void suspend() {
		dt.suspend();
	}

	public final void resume() {
		dt.resume();
	}

	public final void setPriority(int newPriority) {
		dt.setPriority(newPriority);
	}

	public final int getPriority() {
		return dt.getPriority();
	}

	public final void setName(String name) {
		dt.setName(name);
	}

	public final String getName() {
		return dt.getName();
	}

	public final ThreadGroup getThreadGroup() {
		return dt.getThreadGroup();
	}

	public int countStackFrames() {
		return dt.countStackFrames();
	}

	public final void join(long millis) throws InterruptedException {
		dt.join(millis);
	}

	public final void join(long millis, int nanos) throws InterruptedException {
		dt.join(millis, nanos);
	}

	public final void join() throws InterruptedException {
		dt.join();
	}

	public final void setDaemon(boolean on) {
		dt.setDaemon(on);
	}

	public final boolean isDaemon() {
		return dt.isDaemon();
	}

	public final void checkAccess() {
		dt.checkAccess();
	}

	public String toString() {
		return dt.toString();
	}

	public ClassLoader getContextClassLoader() {
		return dt.getContextClassLoader();
	}

	public void setContextClassLoader(ClassLoader cl) {
		dt.setContextClassLoader(cl);
	}

	public StackTraceElement[] getStackTrace() {
		return dt.getStackTrace();
	}

	public long getId() {
		return dt.getId();
	}

	public State getState() {
		return dt.getState();
	}

	public UncaughtExceptionHandler getUncaughtExceptionHandler() {
		return dt.getUncaughtExceptionHandler();
	}

	public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) {
		dt.setUncaughtExceptionHandler(eh);
	}
}

public class DthredTest {
	public static void main(String[] args) {

		new Mthread(new Work() {

			@Override
			public void work() {
		 
				System.out.println(Thread.currentThread());
			}
		});

		new Mthread(new Work() {

			@Override
			public void work() {
				// TODO Auto-generated method stub
				System.out.println(Thread.currentThread());
			}
		});
		
		
		while (Thread.activeCount() > 1) {
			Thread.yield();
		}

	}
}

 

相關推薦

JavaRunnableThread區別

在面試中老有面試官問這個問題,個人覺得這個問題問的沒有技術,一個死記硬背就能回答的很好。但是更深的回答是什麼了,那就是直接回答原始碼吧。 thread類實現了runnable 介面 ,Runnable就是一個藉口 ,只能我們去實現了才能用 對吧,不管是普通類 還是匿名內部類

JavaRunnableThread區別

概述 Runnable 是介面。 Thread 是類,且實現了Runnable介面。 Thread部分原始碼 public class Thread implements Runnable

JavaRunnableThread以及Callable的區別

        在java中,其實java中實現 多執行緒有三種方法,一種是繼承Thread類;第二種是實現Runnable介面;第三種是實現Callable介面。 1,繼承Thread         Thread類是在java.lang包中定義的。一

javaRunnableThread區別與實現方法

1、多執行緒中start()和run()方法的區別 1) start: 用start方法來啟動執行緒,真正實現了多執行緒執行,這時無需等待run方法體程式碼執行完畢而直接繼續執行下面的程式碼。通過呼叫Thread類的 start()方法來啟動一個執行緒,這時

javareplace()replaceAll()的區別

replace和replaceAll是JAVA中常用的替換字元的方法,它們的區別是: 1)replace的引數是char和CharSequence,即可以支援字元的替換,也支援字串的替換(CharSequence即字串序列的意思,說白了也就是字串); 2)replaceA

javaArrayListLinkedList區別

插入 list 新的 查找 arr tro 基於 列表 時間復雜度 ArrayList和LinkedList最主要的區別是基於不同數據結構 ArrayList是基於動態數組的數據結構,LinkedList基於鏈表的數據結構,針對這點,從時間復雜度和空間復雜度來看主要區別:

Mybatis的 ${ } #{ }的區別

mybatis sql註入 語句 nbsp 之前 com pre 預編譯 sql 語句 一、舉例說明 1 select * from user where name = "dato"; 2 3 select * from user where name = #

javaequals==的區別

ML int .net 重寫 com span double str 文獻 (表達可能存在錯誤,需進一步完善) 1、首先搞清楚java裏面的數據類型包括: 基本數據類型和引用數據類型 2、數據類型 基本數據類型: byte,short(2 byte),int(4 byt

JavaArrayListLinkedList區別(轉)

java linked .com -s lan font array href spa 具體詳情參考原博客: http://pengcqu.iteye.com/blog/502676Java中ArrayList和LinkedList區別(轉)

Javaequals==的區別總結

1)對於==,如果作用於基本資料型別的變數,則直接比較其儲存的 “值”是否相等;如果作用於引用型別的變數,則比較的是所指向的物件的地址。 2)對於equals方法,equals方法是Object的,所有繼承了Object類的類都有該方法,注意:equals方法不能作用於基本資料型別的變數

JavaerrorException區別

1、error—錯誤 : 是指程式無法處理的錯誤,表示應用程式執行時出現的重大錯誤。 例如jvm執行時出現的OutOfMemoryError以及Socket程式設計時出現的端口占用等程式無法處理的錯誤 2、Exception — 異常 :異常可分為執行時異常跟編譯異常) 1.執行時異常:

JavainstanceofisInstance區別

instanceof: obj.instanceof(class) 判斷這個物件是不是這種型別, 1.一個物件是本身類的一個物件 2.一個物件是本身類父類(父類的父類)和介面(介面的介面)的一個物件 3.所有物件都是Object 4.凡是null有關的都是fals

JavaComparableComparator區別小結

回到頂部一、Comparable簡介   Comparable是排序介面。若一個類實現了Comparable介面,就意味著該類支援排序。實現了Comparable介面的類的物件的列表或陣列可以通過Collections.sort或Arrays.sort進行自動排序。   此外,實現此介面的物件可以用作有序對映

JavaArrayListLinkedList區別(常見面試題)

一般大家都知道ArrayList和LinkedList的大致區別:     1.ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。     2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為Lin

後端---JavaArrayListLinkedList區別聯絡

ArrayList和LinkedList的區別和聯絡 在一個多月之前,我曾寫過一篇部落格想要迅速簡潔的瞭解Java中所有的集合型別(List、Set、Map),然後一個月多後的我不得已又抱起《Java核心卷I 》仔細研讀,這是為什麼呢??? 是因為“溫故而知新”還是因為“書讀百遍其

JAVA物件的理解

   我們知道程式語言是一個幫助我們和計算機“對話”的工具,我們可以通過它去讓計算機做一些事。而JAVA語言又是其中的高階語言,那麼什麼是高階?機器語言和人類語言之間有著巨大的鴻溝,人們不斷的想要跨過這個鴻溝,在這個過程中出現了一些“工具”,就是所謂的程式語言。通過這些語言

JavaArrayListLinkedList區別以及時間複雜度與空間複雜度

Java中ArrayList和LinkedList區別以及時間複雜度與空間複雜度? 一.時間複雜度 二.空間複雜度 三.總結    一般大家都知道ArrayList和LinkedList的大致區別: 1.ArrayList是實現了基於動態陣

JavaHashtableHashMap區別

第一,繼承和實現不同 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializ

Java Equals==的區別

在談論equals和==的區別前,我們先簡單介紹一下JVM中記憶體分配的問題。 在JVM中 記憶體分為棧記憶體和堆記憶體。二者有什麼區別呢? 當我們建立一個物件(new Object)時,就會呼叫它的建構函式來開闢空間,將物件資料儲存到堆記憶體中,與此同時在棧記憶體中生成對

Javaequals==的區別,equalshashcode的區別

Java中的資料型別,可分為兩類: 1.基本資料型別,也稱原始資料型別。byte,short,char,int,long,float,double,boolean   他們之間的比較,應用雙等號(==),比較的是他們的值。 2.複合資料型別(類)   當他們用(==)進行比較