1

Я хочу получить доступ к данным внутри исполняемых объектов, которые у меня есть в пользовательском исполнителе threadpool. Если я попытался получить доступ к методам before/after execute, я получаю исключение класса. Как разрешить этот сценарий.Как получить доступ к объектам потока внутри пользовательских методов исполнителей потока?

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

Вы попробовали лить paramRunnable? –

+0

Я пробовал это. Отредактирован код выше. Когда я пытаюсь придать тип, я получаю эту проблему. – googytech

ответ

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 */  
} 
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(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^