我正在尝试将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
的接口,并具有您想要的任何其他方法...