threadpool - What is the runnable object passed in Java thread pool RejectedExecutionHandler -


i have thread pool rejectedexecutionhandler , runnable task.

sexecutorservice = new threadpoolexecutor( ...    new myrejectionhandler() );  interface mytask extends runnable { ... }  class mytaskimpl implements mytask { ...}      

i execute task this

   sexecutorservice.submit(mytask);         

in rejectedexecution case hoping hold of rejected runnable (ie mytask) , set field in marking rejected. not able cast mytask. runnable passed t o rejectedexecution ? appears not mytask submitted . , how can hold of rejected task in rejectedexecutionhandler.

public class myrejectionhandler implements rejectedexecutionhandler{      public void rejectedexecution(runnable runnable, threadpoolexecutor executor)  {     mytask mytask = (mytask) runnable; // exception     mytask.dosomething();    } java.lang.classcastexception: java.util.concurrent.futuretask cannot cast mytask        

the problem when submit task submit method treadpoolexecutor (actually abstractexecutorservice) wrap futuretask. after receive futuretask not runnable. can call execute not submit:

sexecutorservice.execute(yourtask); 

i don't think there way task futuretask. can call run it. if want call submit , need call run - not convert mytask:

futuretask mytask = (futuretask) runnable; mytask.run(); object result = mytask.get(); 

other way if want access mytask object can creating of myfuturetask extends futuretask, allow object:

public myfuturetask<v> extends futuretask<v> {      private runnable mytask;      public myfuturetask(runnable runnable, v result) {         super(runnable, result);         this.mytask = runnable;     }      public runnable getmytask() {         return mytask;     }         } 

also need extends threadpoolexecutor , redefine newtaskfor method responsible runnable futuretask wraping:

public class mythreadpoolexecutor extends threadpoolexecutor {      @override     protected <t> runnablefuture<t> newtaskfor(runnable runnable, t value) {         return new myfuturetask(task, value);                 } } 

after can use mythreadpoolexecutor threadpoolexecutor , in rejecting task processing:

myfuturetask myfuturetask = (myfuturetask) runnable; mytask mytask = (mytask) myfuturetask.getmytask(); // can want task: mytask.dosomthing();     

Comments

Popular posts from this blog

django - How can I change user group without delete record -

java - Need to add SOAP security token -

java - EclipseLink JPA Object is not a known entity type -