2016-07-04 18 views
2
/** 
* 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(); 
} 

スレッドクラスのドキュメントでは、スレッドを意味的にクローンにすることはできません。これはどういう意味ですか?なぜスレッドクラスはクローンメソッドをサポートしていませんか?

+2

スレッドをクローンする方法は? – Kayaman

+0

ThreadとしてのCloneNotSupportedExceptionを意味的にクローンにすることはできません。 https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#clone() – PVR

+0

なぜスレッドをクローンする必要がありますか?現在実行中のスレッドをクローンすると、セマンティクス(結果)はどうなるでしょうか?モニタを保持しているスレッドをクローンしたら?あなたはおそらくさらに興味深い質問を見つけることができます。 –

答えて

5

スレッドは、jvm内で管理されている状態やメカニズムに密接に関連しており、おそらくはオペレーティングシステムの基礎となる実装に関連付けられたリソースもあります。

スレッドの状態を通常のスレッドスタートアップ/シャットダウンメカニズムを使わずに複製すると、予期せぬ結果が得られるか、最悪の場合は致命的なjvmクラッシュが発生します。

-1

クローン法と呼ばれる、Objectクラスから継承される);あなたが発見したコードを考えると

が、それは「悪い考え」(tm)のですが、あなたがこれを行うためのものではないしていることは明らかですオブジェクトクラスはCloneable Interfaceを実装していません。したがって、JDKのドキュメントでは、

"オブジェクトのクローンを作成するためにObjectクラスのクローンメソッドが呼び出されたが、オブジェクトのクラスはCloneableインターフェイスを実装していないことを示すためにスローされます。 ref

したがって、javaで作成されたすべてのオブジェクトにはクローンメソッドがありますが、クローンインターフェイスを実装するわけではありません。私の個人的な意見では、このメソッドは開発者に何がクローン可能であるかどうかを判断する機会を与え、実際にオブジェクト全体をクローンする必要がある場合は、Cloneableを実装する必要があります。

乾杯。

1

ドキュメントの説明と同様に、新しいスレッドを作成したい別のスレッドが必要な場合は、スレッドをクローンするのは意味がありません。

スレッドをクローンしたい場合は、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-そのポイントを完全に逃してしまうような練習をする。表面的には、これはThreadをサブクラス化するのではなくRunnableを実装するアドバイスに従っていますが、実行する特定のThreadにタスクを関連付けることは、そのアドバイスの目的を破ります。

独立して実行する必要があるタスクや非同期に実行する必要があるタスクについては、スレッドのことを知る必要はありません。その代わりに、Executorサービスによって実行できるように設計する方がよいでしょう。 RunnableとCallableの2つのインタフェースが用意されています。これらのインタフェースは、スレッドをサブクラス化するのではなく、特定の実行手段に結び付けない方法でタスクを指定できるようにするために用意されています。特定のThreadオブジェクト。そうすれば、タスクを変更せずに実行方法を自由に変更することができます。また、スレッドが関与しないため、クローン可能なタスクを自由に作成できます。

関連する問題