我正在尝试将返回的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())返回的Thread实际上应该是BackgroundThread的一个实例。根据我的理解,这应该使我在上面尝试“向下转换”合法(因为它不应该真的是向下转换),但Android运行时(针对SDK修订版17)不同意。上述演员的违法行为是什么?我应该使用什么替代方法(希望没有创建我自己的扩展ThreadFactory的BackgroundThreadFactory类)?
答案 0 :(得分:4)
ThreadFactory
在Runnable
周围包裹一个帖子。因此,它正在创建其他类型的Thread
,它会在run()
启动时调用BackgroundThread
方法。
您可能要做的是创建自己的ThreadFactory
实施,以创建BackgroundThread
。
答案 1 :(得分:3)
但mvThreadSource.newThread(new BackgroundThread())返回的Thread实际上应该是BackgroundThread的一个实例
是什么让你这么想?
是什么让您认为首先将Thread
的实例传递给ThreadFactory.newThread
是个好主意?在某些情况下,创建Thread
实例而不启动它们实际上会导致内存泄漏,我相信。 (很可能不在Android上,请注意。)
ThreadFactory.newThread
的参数属于Runnable
类型而不是Thread
的原因有一个原因 - 它只是意味着是“应该运行的动作“而不是一个线程。创建线程来运行动作是ThreadFactory
的工作 - 这就是为什么它被称为ThreadFactory
:)
您可以创建自己的ThreadFactory
创建BackgroundThread
个实例,但不清楚为什么要首先这样做。你的实际要求是什么?也许您实际上不应该构建List<BackgroundThread>
而是List<BackgroundRunnable>
,其中BackgroundRunnable
是一个扩展Runnable
的接口,并且您可以使用任何额外的方法...
答案 2 :(得分:2)
不,ThreadFactory.newThread返回一个Thread:
class SimpleThreadFactory implements ThreadFactory {
public Thread newThread(Runnable r) {
return new Thread(r);
}
}
由newThread返回的线程不是BackGroundThread - &gt;代码中的ClassCastException。
请注意,newThread的输入参数采用Runnable。你的BackGroundThread是一个Runnable,但newThread并不意味着接受Threads。它应该接受将被包装到线程中的Runnables。