在执行程序服务延迟后安排任务

schedule a task after a delay in executor service

我想要一个任务在延迟 3 秒后执行,而我的一个任务需要 2 秒才能完成。

我得到的输出显示间隔为 5 秒

注意:学生class实现了Callable接口 我有以下疑问

  1. 为什么有5秒的延迟coming.How可以做3秒的延迟 seconds 为什么第二次执行时显示线程1,应该是 线程二

我得到的输出是

The time is : Sat Nov 26 15:08:02 IST 2016

Doing a task during : prerna - Time - Sat Nov 26 15:08:06 IST 2016
pool-1-thread-1 Helloprerna
Doing a task during : abc - Time - Sat Nov 26 15:08:11 IST 2016
pool-1-thread-1 Helloabc
Doing a task during : def - Time - Sat Nov 26 15:08:16 IST 2016
pool-1-thread-2 Hellodef
Doing a task during : xyz - Time - Sat Nov 26 15:08:21 IST 2016
pool-1-thread-1 Helloxyz
Doing a task during : ritu - Time - Sat Nov 26 15:08:26 IST 2016
pool-1-thread-3 Helloritu
Doing a task during : babita - Time - Sat Nov 26 15:08:31 IST 2016
pool-1-thread-2 Hellobabita

代码:

private String display(String name2) {

    try {
        //  System.out.println(Thread.currentThread().getName());
        name2=Thread.currentThread().getName()+" Hello"+ name;
        System.out.println("Doing a task during : " + name + " - Time - " + new Date());
        Thread.sleep(000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return name2;
}


@Override
public String call() throws Exception {
    // TODO Auto-generated method stub
    if (name == "archana") {

        throw new Exception();
    }
        /*} catch (Exception e) {
            // TODO Auto-generated catch block
        //  e.printStackTrace();
        }finally{
            return "error";
        }*/

    return display(name);
}

public class ExecutorScheduleDemo {

    public static void main(String args[]) throws InterruptedException{
        ScheduledExecutorService executor= Executors.newScheduledThreadPool(5);
        ArrayList<Student> list = new ArrayList<Student>();

        list.add(new Student("prerna"));
        list.add(new Student("abc"));
        //list.add(new Student("archana"));
        list.add(new Student("def"));
        list.add(new Student("xyz"));
        list.add(new Student("ritu"));
        list.add(new Student("babita"));
        System.out.println("The time is : " + new Date());
        List<Future<String>> resultList= new  ArrayList<Future<String>>();
        for(Student s:list){
            Future<String> f=executor.schedule(s, 3, TimeUnit.SECONDS);

            try {
                System.out.println(f.get());
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

使用 scheduleAtFixedRate(Runnable, long initialDelay, long period, TimeUnit timeunit) 而不是 schedule(Runnable task, long delay, TimeUnit timeunit)

scheduleAtFixedRate (Runnable, long initialDelay, long period, TimeUnit timeunit)
Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given period; that is executions will commence after initialDelay then initialDelay+period, then initialDelay + 2 * period, and so on. If any execution of the task encounters an exception, subsequent executions are suppressed. Otherwise, the task will only terminate via cancellation or termination of the executor. If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute. next execution.

为了完成 eedev 的回答,因为你的对象似乎是 Callable:

您可以通过将 Callable 传递给构造函数来简单地创建一个新的 FutureTask,如 oracle docs

中所述

注意 FutureTask 的类型参数必须与 Callable 的相同。

示例:

class Main {

    public static void main(String[] args) {
        Foo foo = new Foo();
        FutureTask<String> fooFutureTask = new FutureTask<>(foo);
    }
}

class Foo implements Callable<String> {

    @Override
    public String call() throws Exception {
        return "Calling";
    }
}

然后您可以按照 eedev 的描述安排新创建的 FutureTask 执行。