Java 如何获得任务';RejectedExecutionHandler中的s字段?
我想知道被执行者拒绝的Java 如何获得任务';RejectedExecutionHandler中的s字段?,java,multithreading,concurrency,threadpool,Java,Multithreading,Concurrency,Threadpool,我想知道被执行者拒绝的任务。例如,我想获取被拒绝任务的名称。但是在被拒绝的执行处理器中,我不能这样做 这是我的密码: public static void main(String[] args) throws Exception{ ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 1L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(),
任务
。例如,我想获取被拒绝任务的名称。但是在被拒绝的执行处理器
中,我不能这样做
这是我的密码:
public static void main(String[] args) throws Exception{
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 1L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(),
(Runnable r, ThreadPoolExecutor executor1) -> {
//TODO
//want to get the task name
System.out.println("in reject:");
});
Task t1 = new Task("t1");
Task t2 = new Task("t2");
Future<Integer> t1Fe = executor.submit(t1);
Future<Integer> t2Fe = executor.submit(t2);
System.out.println(t1Fe.get());
System.out.println(t2Fe.get());
}
static class Task implements Callable{
private String name;
public Task(String name) {
this.name = name;
}
@Override
public Object call() throws Exception {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(1);
return name;
}
}
publicstaticvoidmain(字符串[]args)引发异常{
ThreadPoolExecutor executor=新的ThreadPoolExecutor(1,1,1L,TimeUnit.SECONDS,new SynchronousQueue(),
(Runnable r,ThreadPoolExecutor Executor 1)->{
//待办事项
//要获取任务名称吗
System.out.println(“in-reject:”);
});
任务t1=新任务(“t1”);
任务t2=新任务(“t2”);
未来t1Fe=执行人提交(t1);
未来t2Fe=执行人提交(t2);
System.out.println(t1Fe.get());
System.out.println(t2Fe.get());
}
静态类任务实现了可调用{
私有字符串名称;
公共任务(字符串名称){
this.name=名称;
}
@凌驾
公共对象调用()引发异常{
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
系统输出打印项次(1);
返回名称;
}
}
我重写了submit
方法并重写了FutureTask
类
public static void main(String[] args) throws Exception{
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 1L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(),
(Runnable r, ThreadPoolExecutor executor1) -> {
//TODO
//want to get the task name
MyFutureTask task = (MyFutureTask)r;
System.out.println("in reject:"+task.name);
});
Task t1 = new Task("t1");
Task t2 = new Task("t2");
Future<Integer> t1Fe = submit(executor,t1);
Future<Integer> t2Fe = submit(executor,t2);
System.out.println(t1Fe.get());
System.out.println(t2Fe.get());
}
public static Future submit(ThreadPoolExecutor executor,Callable task) {
if (task == null) throw new NullPointerException();
MyFutureTask ftask = new MyFutureTask(task);
ftask.setName(((Task)task).name);
executor.execute(ftask);
return ftask;
}
static class MyFutureTask extends FutureTask{
private String name;
public MyFutureTask(Callable callable) {
super(callable);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
static class Task implements Callable{
private String name;
public Task(String name) {
this.name = name;
}
@Override
public Object call() throws Exception {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(1);
return name;
}
}
publicstaticvoidmain(字符串[]args)引发异常{
ThreadPoolExecutor executor=新的ThreadPoolExecutor(1,1,1L,TimeUnit.SECONDS,new SynchronousQueue(),
(Runnable r,ThreadPoolExecutor Executor 1)->{
//待办事项
//要获取任务名称吗
MyFutureTask任务=(MyFutureTask)r;
System.out.println(“in-reject:+task.name”);
});
任务t1=新任务(“t1”);
任务t2=新任务(“t2”);
未来t1Fe=提交(执行人,t1);
未来t2Fe=提交(执行人,t2);
System.out.println(t1Fe.get());
System.out.println(t2Fe.get());
}
公共静态未来提交(ThreadPoolExecutor,可调用任务){
如果(task==null)抛出新的NullPointerException();
MyFutureTask ftask=新建MyFutureTask(任务);
ftask.setName(((任务)Task.name);
执行人执行(ftask);
返回ftask;
}
静态类MyFutureTask扩展了FutureTask{
私有字符串名称;
公共MyFutureTask(可调用可调用){
超级(可调用);
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}
静态类任务实现了可调用{
私有字符串名称;
公共任务(字符串名称){
this.name=名称;
}
@凌驾
公共对象调用()引发异常{
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
系统输出打印项次(1);
返回名称;
}
}
您的任务被包装到FutureTask中,而FutureTask不提供任务的getter。您可以使用反射来访问FutureTask
的callable
字段,但这不是一种非常可靠的方法。请重写RejectedExecutionHandler并创建您自己的。这是最好的方法。@canillas这就是问题代码中所做的。问题是如何从Runnable中访问底层任务。@assylias我在代码中没有看到您的自定义处理程序。。。类似于公共类MyRejectedExecutionHandler实现RejectedExecutionHandler{
它就在那里:(Runnable r,ThreadPoolExecutor Executor 1)->{System.out.println(“in reject:);})
做得很好-或者您可以扩展ThreadPoolExecutor并覆盖3个submit
方法。@assylias:更好的方法是,覆盖正是为此目的而创建的;这样,您就不需要覆盖所有submit
方法,也不用担心将来的版本可能会提供您没有覆盖的其他提交方法登…