如何访问自定义线程池执行器方法中的线程对象?

时间:2015-03-17 02:15:26

标签: java multithreading executorservice threadpoolexecutor executors

我想访问自定义线程池执行器中的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 */    
 }

2 个答案:

答案 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();
    }
}