2012-12-27 13 views
7

爲什麼下面的代碼在JDK7中拋出CloneNotSupportedException但是不在JDK6中CloneNotSupportedException即使在執行Cloneable時

public class DemoThread extends Thread implements Cloneable { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     DemoThread t = new DemoThread(); 
     t.cloned(); 
    } 

    public DemoThread cloned() 
    { 
     try { 
      return (DemoThread) super.clone(); 
     } catch (CloneNotSupportedException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

} 
+3

顯然,方法根據javadocs中的以下理由進行了更改:'拋出CloneNotSupportedException,因爲線程無法被有意克隆。' –

+0

將幫助您包含堆棧跟蹤 – radai

回答

6

這裏的線程的執行clone()在SE 7

/** 
* Throws CloneNotSupportedException as a Thread can not be meaningfully 
* cloned. Construct a new Thread instead. 
* 
* @throws CloneNotSupportedException 
*   always 
*/ 
@Override 
protected Object clone() throws CloneNotSupportedException { 
    throw new CloneNotSupportedException(); 
} 

線程從未設計被克隆。做了一些閱讀引發了我發現的一個意見,總結得很好:"But we either have to disallow cloning or give it meaningful semantics - and the latter isn't going to happen." - 大衛霍姆斯

+0

我們可以查看源代碼以查看此內容。問題是爲什麼在早期版本的JDK中沒有以這種方式實現它。 –

+0

可能是因爲他們通過使Thread實現Cloneable而造成設計錯誤,並在JDK7中修復了此設計錯誤。 –

+1

發現相關的東西 - http://weblog.ikvm.net/PermaLink.aspx?guid=23cced47-ccdb-460d-acc9-ce16154ab6a5 – Manish

3

這是行不通的,因爲線程無法克隆。代碼的第16行嘗試克隆未實現接口Cloneable的超類(Thread)。除了克隆線程之外,根本不是一個好主意。你需要創建一個新的線程。這是這裏唯一可能的解決方案。

+0

請注意,對於一個類爲Cloneable,它的超類實現並不是必需的也可以克隆。畢竟Object沒有實現Cloneable。 – bowmore