使用ExecutorService java执行线程

使用ExecutorService java执行线程,java,multithreading,Java,Multithreading,如您所见,我有两个类WorkerThread和ThreadPool。我尝试在3秒的初始延迟后执行workerthread任务,然后在另外3秒的延迟后执行相同的任务。我使用了ScheduleWithFixedLay和scheduleAtfixedRate,它会等待第一次,但不会等待第二次。我是高级线程编程新手,所以有人能帮我解决我在下面代码中的错误吗?或者有没有其他类来完成这个任务 class WorkerThread implements Runnable { private Stri

如您所见,我有两个类WorkerThread和ThreadPool。我尝试在3秒的初始延迟后执行workerthread任务,然后在另外3秒的延迟后执行相同的任务。我使用了ScheduleWithFixedLay和scheduleAtfixedRate,它会等待第一次,但不会等待第二次。我是高级线程编程新手,所以有人能帮我解决我在下面代码中的错误吗?或者有没有其他类来完成这个任务

class WorkerThread implements Runnable {

    private String command;

    public WorkerThread(String s){
        this.command=s;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+" Start. Command = "+command);
        processCommand();
        try {
            System.out.println("Doing a task during : " + command + " - Time - " + new Date());
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName()+" End.");
    }

    private void processCommand() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String toString(){
        return this.command;
    }
}


  public class ThreadPool {
      public static int times=0;
 public static ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
    public static void main(String[] args) 
    {

        WorkerThread worker = new WorkerThread("proud"); 
       int i=0;
        while(i<2)
        {
        System.out.println(i);

        executor.scheduleAtFixedRate(worker, 3, 3, TimeUnit.SECONDS);
        i++;
        }

通读这两个的文档,但是知道你工作中的代码是什么,你想要
scheduleAtFixedRate
还是
scheduleAtFixedDelay
?我读了它们,所以我使用了它们(如果我错了,请纠正我)。我认为我的问题不在于我应该使用什么,但在上述代码中两者的行为几乎相同。我希望以固定的周期性延迟执行同一任务,这在我的情况下是无法实现的。您能解释一下您期望看到的内容和实际看到的内容吗?因为您计划了两次任务,并且池中有两个线程,所以这两个线程都会哭喊三秒钟,然后几乎在同一时间运行。是否确实要将同一任务安排在类似的时间并行运行?我不确定您是否真的要调用
schedule…
两次。这是记录在案的行为:如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。。我将重新表述David的问题:您真的希望任务在上一次执行尚未完成时开始重新执行吗?如果是这样,每个任务可能只包括将其作业提交给ExecutorService。
pool-1-thread-2 Start. Command = proud//waits for 3 seconds
pool-1-thread-1 Start. Command = proud//does not wait (for 3 seconds) to execute the same task 
Doing a task during : proud - Time - Sat Nov 21 18:10:56 EST 2015
pool-1-thread-1 End.
Doing a task during : proud - Time - Sat Nov 21 18:10:56 EST 2015
pool-1-thread-2 End.