就像文档说的那样,如果你想要创建一个新线程的话,克隆一个线程是没有意义的。
如果您希望克隆一个线程的位置,这表明您已经扩展了线程,您应该已经实现了Runnable,否则您已经设法将您的域对象绑定到线程。例如,有时人们创建一个实现Runnable类的不幸的反模式,然后创建一个线程为这个类的一个这样的实例成员:
// Example of anti-pattern, please don't do this!
class MyTask implements Runnable {
private Thread thread;
public void start() {
thread = new Thread(this);
thread.start();
}
public void run() {
// whatever code your task performs
}
}
这是盲从BEST-一个很好的例子以一种完全忽略这一点的方式实践。虽然从表面上看,这遵循了关于实现Runnable而不是子类化Thread的建议,但将任务绑定到执行它的特定Thread会违反该建议的目的,该建议旨在帮助将任务从执行方式中分离出来。
需要独立运行或异步运行的任务不必知道线程,最好设计它们以便它们可以由执行程序服务运行。有两个接口,Runnable和Callable,这些接口是为了让你指定任务的方式不是将它们绑定到特定的执行方式而提供的,而不是将子任务绑定到Thread,在这里你将任务绑定到特定的Thread对象。这样你就可以自由地改变它们在不改变任务的情况下被执行的方式,而且你也可以自由地创建可克隆的任务,因为不会涉及任何线程。
那么,你会如何克隆一个线程? – Kayaman
抛出CloneNotSupportedException,因为线程无法被有意克隆。 https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#clone() – PVR
为什么要克隆一个线程?如果克隆当前正在运行的线程,应该是什么语义(结果)?如果你克隆一个拥有显示器的线程?你可能会发现更有趣的问题。 –