我想访问自定义线程池执行器中的runnable对象内的数据。如果我尝试在执行前/后方法中访问,我将获得类强制转换异常。我该如何解决这个问题。
public class MyThread implements Runnable
{
String key;
public void run(){ /* Do something */}
}
public class MyExecutor extends ThreadPoolExecutor
{
@Override
protected void beforeExecute(Thread paramThread, Runnable paramRunnable)
{
MyThread mt = (mt)paramRunnable;
}
@Override
protected void afterExecute(Runnable paramRunnable, Throwable paramThrowable)
{
MyThread mt = (mt)paramRunnable;
/* Need to access "key" inside MyThread */
}
答案 0 :(得分:0)
如果获得ClassCastException
,则表示您将非MyThread
的线程实现或MyThread
的子类传入您的MyExecutor
。因此,为了解决这个问题,您只需在投射前进行instanceof
检查。
public class MyExecutor extends ThreadPoolExecutor
{
@Override
protected void beforeExecute(Thread paramThread, Runnable paramRunnable)
{
if(paramRunnable instanceof MyThread) {
MyThread mt = (MyThread)paramRunnable;
}
}
@Override
protected void afterExecute(Runnable paramRunnable, Throwable paramThrowable)
{
if(paramRunnable instanceof MyThread) {
MyThread mt = (MyThread)paramRunnable;
}
/* Need to access "key" inside MyThread */
}
答案 1 :(得分:0)
解决方案是使用我的线程作为可调用的,并在futuretask响应中获取响应。以下实现解决了我的解决方案。
protected void afterExecute(Runnable paramRunnable, Throwable paramThrowable) {
super.afterExecute(paramRunnable, paramThrowable);
FutureTask<String> task = (FutureTask<String>) paramRunnable;
try {
String a = task.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}