Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获得任务';RejectedExecutionHandler中的s字段?_Java_Multithreading_Concurrency_Threadpool - Fatal编程技术网

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
方法,也不用担心将来的版本可能会提供您没有覆盖的其他提交方法登…