使用ScheduledExecutorService并发运行多个线程

时间:2017-03-30 08:19:21

标签: java

以下代码会定期执行文件传输任务。我想通过调用相同的方法从不同的位置同时做另一个文件复制任务。为此我创建了另一个runnable2和executor2实例并执行。如何使用单个实例执行多个任务,而不是创建多个实例。

public static void main(String[] args) {

        Runnable runnable = new Runnable() {
          public void run() {

            File srcFolder = new File("c:\\location1\\Test1\\");
            File destFolder = new File("d:\\location1\\Test1\\");

            if(!srcFolder.exists()){
               System.out.println("Directory does not exist.");
               System.exit(0);
            }else{
               try{
                copyFolder(srcFolder,destFolder);
               }catch(IOException e){
                e.printStackTrace();
                System.exit(0);
               }
            }
            System.out.println("Done");           
            }
        };

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);    
    executor.scheduleAtFixedRate(runnable, 0, 300, TimeUnit.SECONDS);
}

1 个答案:

答案 0 :(得分:0)

如果你要多次执行相同的操作,那么创建一个类比匿名类更好(使它在构造函数中有2个参数):

public class FileCopy implements Runnable {

    private String src="", dest = "";
    public FileCopy(String src, String dest){
        this.src  = src;
        this.dest = dest;
    }

    @override
    public void run(){
        File srcFolder = new File(src);
        File destFolder = new File(dest);

        if(!srcFolder.exists()){
           System.out.println("Directory does not exist.");
           //System.exit(0);
        }else{
           try{
            copyFolder(srcFolder,destFolder);
           }catch(IOException e){
            e.printStackTrace();
            //System.exit(0);
           }
        }
        System.out.println("Done"); 
    }//run
}

现在您可以根据需要制作任意数量的实例,每次都传递不同的参数,然后执行 Runnable

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);    
executor.scheduleAtFixedRate(new FileCopy(src1, dest1), 0, 300, TimeUnit.SECONDS);
executor.scheduleAtFixedRate(new FileCopy(src2, dest2), 0, 300, TimeUnit.SECONDS);

注意:

  • 您可能需要将此newScheduledThreadPool(1)更改为newScheduledThreadPool(2)吗?不太确定

  • System.exit(0);现在不是一个选项,如果出现错误,因为你有多个实例正在运行,如果有问题,这不应该意味着关闭整个应用程序,你需要实现另一种方式处理错误