8

为什么以下代码在 JDK7 中抛出 CloneNotSupportedException 而在 JDK6 中却没有

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;
    }

}
4

2 回答 2

6

这是 Threadclone()在 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();
}

线程从未被设计为被克隆。做一些阅读引发了我发现这总结得很好的评论之一:“但我们要么禁止克隆,要么赋予它有意义的语义——后者不会发生。” ——大卫·福尔摩斯

于 2012-12-27T09:28:54.267 回答
3

这不起作用,因为无法克隆线程。代码的第 16 行尝试克隆未实现接口 Cloneable 的超类(线程)。除了克隆线程根本不是一个好主意。您需要创建一个新线程。这是这里唯一可能的解决方案。

于 2012-12-27T09:34:15.007 回答