1

次のように、Java の ThreadFactory.newThread(Runnable r) から返された Thread オブジェクトを、Android アプリケーションが使用する Thread の特定のサブクラスにキャストしようとしています。

private ThreadFactory mvThreadSource = Executors.defaultThreadFactory();

...

//Invokes the thread factory's newThread(Runnable r) method 
//mvThreadsVector is an ArrayList<BackgroundThread>
//class BackgroundThread extends Thread and implements an interface
public void spawnBGThreads(int numThreads){
 for (int i=0;i<numThreads;i++){
  mvThreadsVector.add((BackgroundThread) mvThreadSource.newThread(new
  BackgroundThread())); 
 }
}

これにより、クラス キャストの例外がスローされますが、その理由はわかりません。実行できないダウンキャストを試みているように見えますが、mvThreadSource.newThread(new BackgroundThread()) によって返される Thread は、実際には BackgroundThread のインスタンスである必要があります。私の理解では、これにより、上記のように「ダウンキャスト」することが合法になるはずですが (実際にはダウンキャストであってはならないため)、Android ランタイム (SDK リビジョン 17 をターゲットとする) は同意しません。上記のキャストについて何が違法ですか? どの代替アプローチを使用する必要がありますか (できれば、ThreadFactory を拡張する独自の BackgroundThreadFactory クラスを作成しないでください)。

4

3 に答える 3

4

ThreadFactoryスレッドを a に巻き付けますRunnable。そのため、開始時にメソッドをThread呼び出す他の種類の を作成しています。run()BackgroundThread

おそらく、あなたがしたいことは、s を作成する独自のThreadFactory実装を作成することBackgroundThreadです。

于 2013-02-07T21:44:18.823 に答える
3

ただし、 mvThreadSource.newThread(new BackgroundThread()) によって返される Thread は、実際には BackgroundThread のインスタンスである必要があります

何があなたをそう思わせたのですか?

そもそもThreadtoのインスタンスを渡すのが良い考えだと思う理由は何ですか? ThreadFactory.newThread場合によっては、Threadインスタンスを起動せずにインスタンスを作成すると、実際にメモリ リークが発生する可能性があると思います。(おそらく Android にはありません。念のため。)

のパラメーターが代わりにThreadFactory.newThread型である理由があります-それは、スレッドではなく「実行する必要があるアクション」であることのみを意図しています。アクションを実行するためのスレッドを作成するのは の仕事です - それが呼び出される理由です:)RunnableThreadThreadFactoryThreadFactory

インスタンスを作成した独自のインスタンスを作成することもできますが、そもそもなぜそうしたいのかが明確ではありません。ここでの実際の要件は何ですか? おそらく、実際には構築するべきではありませんが、代わりに、拡張して必要な追加のメソッドを備えたインターフェイスはどこにありますか...ThreadFactoryBackgroundThreadList<BackgroundThread>List<BackgroundRunnable>BackgroundRunnableRunnable

于 2013-02-07T21:49:39.863 に答える
2

いいえ、ThreadFactory.newThread はスレッドを返します。

class SimpleThreadFactory implements ThreadFactory {
    public Thread newThread(Runnable r) {
        return new Thread(r);
    }
}

newThread によって返される Thread は BackGroundThread ではありません --> コード内の ClassCastException。

newThread の入力パラメーターは Runnable を取ることに注意してください。BackGroundThread は Runnable ですが、newThread はスレッドを受け入れるためのものではありません。スレッドにラップされる Runnables を受け入れる必要があります。

于 2013-02-07T21:46:32.223 に答える