再談 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(); } } }
相關推薦
再談 Java中Runnable和Thread的區別
在面試中老有面試官問這個問題,個人覺得這個問題問的沒有技術,一個死記硬背就能回答的很好。但是更深的回答是什麼了,那就是直接回答原始碼吧。 thread類實現了runnable 介面 ,Runnable就是一個藉口 ,只能我們去實現了才能用 對吧,不管是普通類 還是匿名內部類
Java中Runnable和Thread的區別
概述 Runnable 是介面。 Thread 是類,且實現了Runnable介面。 Thread部分原始碼 public class Thread implements Runnable
Java中Runnable和Thread以及Callable的區別
在java中,其實java中實現 多執行緒有三種方法,一種是繼承Thread類;第二種是實現Runnable介面;第三種是實現Callable介面。 1,繼承Thread Thread類是在java.lang包中定義的。一
java之Runnable和Thread區別與實現方法
1、多執行緒中start()和run()方法的區別 1) start: 用start方法來啟動執行緒,真正實現了多執行緒執行,這時無需等待run方法體程式碼執行完畢而直接繼續執行下面的程式碼。通過呼叫Thread類的 start()方法來啟動一個執行緒,這時
淺談java中replace()和replaceAll()的區別
replace和replaceAll是JAVA中常用的替換字元的方法,它們的區別是: 1)replace的引數是char和CharSequence,即可以支援字元的替換,也支援字串的替換(CharSequence即字串序列的意思,說白了也就是字串); 2)replaceA
java中ArrayList和LinkedList區別
插入 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 = #
java中equals和==的區別
ML int .net 重寫 com span double str 文獻 (表達可能存在錯誤,需進一步完善) 1、首先搞清楚java裏面的數據類型包括: 基本數據類型和引用數據類型 2、數據類型 基本數據類型: byte,short(2 byte),int(4 byt
Java中ArrayList和LinkedList區別(轉)
java linked .com -s lan font array href spa 具體詳情參考原博客: http://pengcqu.iteye.com/blog/502676Java中ArrayList和LinkedList區別(轉)
Java中equals和==的區別總結
1)對於==,如果作用於基本資料型別的變數,則直接比較其儲存的 “值”是否相等;如果作用於引用型別的變數,則比較的是所指向的物件的地址。 2)對於equals方法,equals方法是Object的,所有繼承了Object類的類都有該方法,注意:equals方法不能作用於基本資料型別的變數
Java中error和Exception區別
1、error—錯誤 : 是指程式無法處理的錯誤,表示應用程式執行時出現的重大錯誤。 例如jvm執行時出現的OutOfMemoryError以及Socket程式設計時出現的端口占用等程式無法處理的錯誤 2、Exception — 異常 :異常可分為執行時異常跟編譯異常) 1.執行時異常:
Java中instanceof和isInstance區別
instanceof: obj.instanceof(class) 判斷這個物件是不是這種型別, 1.一個物件是本身類的一個物件 2.一個物件是本身類父類(父類的父類)和介面(介面的介面)的一個物件 3.所有物件都是Object 4.凡是null有關的都是fals
Java中Comparable和Comparator區別小結
回到頂部一、Comparable簡介 Comparable是排序介面。若一個類實現了Comparable介面,就意味著該類支援排序。實現了Comparable介面的類的物件的列表或陣列可以通過Collections.sort或Arrays.sort進行自動排序。 此外,實現此介面的物件可以用作有序對映
Java中ArrayList和LinkedList區別(常見面試題)
一般大家都知道ArrayList和LinkedList的大致區別: 1.ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。 2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為Lin
後端---Java中ArrayList和LinkedList區別和聯絡
ArrayList和LinkedList的區別和聯絡 在一個多月之前,我曾寫過一篇部落格想要迅速簡潔的瞭解Java中所有的集合型別(List、Set、Map),然後一個月多後的我不得已又抱起《Java核心卷I 》仔細研讀,這是為什麼呢??? 是因為“溫故而知新”還是因為“書讀百遍其
淺談JAVA中類和物件的理解
我們知道程式語言是一個幫助我們和計算機“對話”的工具,我們可以通過它去讓計算機做一些事。而JAVA語言又是其中的高階語言,那麼什麼是高階?機器語言和人類語言之間有著巨大的鴻溝,人們不斷的想要跨過這個鴻溝,在這個過程中出現了一些“工具”,就是所謂的程式語言。通過這些語言
Java中ArrayList和LinkedList區別以及時間複雜度與空間複雜度
Java中ArrayList和LinkedList區別以及時間複雜度與空間複雜度? 一.時間複雜度 二.空間複雜度 三.總結 一般大家都知道ArrayList和LinkedList的大致區別: 1.ArrayList是實現了基於動態陣
Java中Hashtable和HashMap區別
第一,繼承和實現不同 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializ
Java 中 Equals和==的區別
在談論equals和==的區別前,我們先簡單介紹一下JVM中記憶體分配的問題。 在JVM中 記憶體分為棧記憶體和堆記憶體。二者有什麼區別呢? 當我們建立一個物件(new Object)時,就會呼叫它的建構函式來開闢空間,將物件資料儲存到堆記憶體中,與此同時在棧記憶體中生成對
Java中equals和==的區別,equals和hashcode的區別
Java中的資料型別,可分為兩類: 1.基本資料型別,也稱原始資料型別。byte,short,char,int,long,float,double,boolean 他們之間的比較,應用雙等號(==),比較的是他們的值。 2.複合資料型別(類) 當他們用(==)進行比較