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
Post a Comment