1

我正在尝试将返回的 Thread 对象从 Java 的 ThreadFactory.newThread(Runnable r) 转换为我的 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()) 返回的线程实际上应该是 BackgroundThread 的一个实例。据我了解,这应该使我在上面尝试的“向下转换”合法化(因为它不应该真正向下转换),但 Android 运行时(针对 SDK 修订版 17)不同意。上述演员阵容有什么违法之处?我应该使用什么替代方法(希望没有创建我自己的扩展 ThreadFactory 的 BackgroundThreadFactory 类)?

4

3 回答 3

4

ThreadFactory围绕 a 包裹一个线程Runnable。因此,它正在创建其他类型的方法,它将在启动时Thread调用run()您的方法。BackgroundThread

可能您想要做的是创建自己的ThreadFactory实现来创建BackgroundThreads.

于 2013-02-07T21:44:18.823 回答
3

但是 mvThreadSource.newThread(new BackgroundThread()) 返回的 Thread 实际上应该是 BackgroundThread 的一个实例

什么让你有那个想法?

是什么让您认为首先传递 to 的实例是个好Thread主意ThreadFactory.newThread?我相信在某些情况下,创建Thread实例而不启动它们实际上会导致内存泄漏。(很可能不在 Android 上,请注意。)

ThreadFactory.newThread参数为类型Runnable而不是类型是有原因的Thread- 它只是应该运行的操作”而不是线程。ThreadFactory创建线程以运行操作是 的工作 - 这就是它被称为的原因ThreadFactory:)

可以创建自己的ThreadFactory创建BackgroundThread实例,但不清楚为什么要首先这样做。您在这里的实际要求是什么?也许您实际上不应该构建一个List<BackgroundThread>,而是List<BackgroundRunnable>在哪里构建一个BackgroundRunnable接口,该接口扩展Runnable并具有您想要的任何额外方法...

于 2013-02-07T21:49:39.863 回答
2

不,ThreadFactory.newThread 返回一个线程:

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

newThread 返回的线程不是代码中的 BackGroundThread --> ClassCastException。

请注意,newThread 的输入参数采用 Runnable。您的 BackGroundThread 是可运行的,但 newThread 并不意味着接受线程。它应该接受将被包装到线程中的 Runnables。

于 2013-02-07T21:46:32.223 回答