我正在尝试将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())返回的线程实际上应该是BackgroundThread的实例。据我了解,这应该使我按照上面的尝试进行“向下转换”是合法的(因为它实际上不应该向下转换),但是Android运行时(针对SDK版本17)是不同意的。以上演员表有何违法行为?我应该使用哪种替代方法(希望没有创建扩展ThreadFactory的自己的BackgroundThreadFactory类)?

最佳答案

但是mvThreadSource.newThread(new BackgroundThread())返回的线程实际上应该是BackgroundThread的实例


什么让你有那个想法?

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

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

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

08-05 08:26