Java 线程执行器:运行多个进程和池等待30分钟,然后启动下一个进程

Java 线程执行器:运行多个进程和池等待30分钟,然后启动下一个进程,java,multithreading,executorservice,java.util.concurrent,threadpoolexecutor,Java,Multithreading,Executorservice,Java.util.concurrent,Threadpoolexecutor,目前,我正在使用ThreadPoolExecutorAPI实现多处理。以下是处理的要求 使用ExecutorService executor=Executors.newFixedThreadPool(3)定义每次使用线程池运行的java进程数 我将所有可运行jar进程的实际进程提交到池中 for(int i=1; i<50; i++) { RunnableTask r=new RunnableTask(); executor.submit(r); } 现在,当池启动时,只有3个进

目前,我正在使用
ThreadPoolExecutor
API实现多处理。以下是处理的要求

  • 使用
    ExecutorService executor=Executors.newFixedThreadPool(3)定义每次使用线程池运行的java进程数
  • 我将所有可运行jar进程的实际进程提交到池中

    for(int i=1; i<50; i++) {
      RunnableTask r=new RunnableTask();
      executor.submit(r);
    }
    
    现在,当池启动时,只有3个进程将并行启动

    我想一次只运行3个进程,完成3个进程后,我的池必须等待30分钟,并需要启动下3个进程。当所有3个流程完成时,必须向池发出通知


    有没有办法使用ThreadExcutorFramwork?

    一个简单的解决方案:只需在可运行的代码中添加30分钟的等待时间

    或者更好:为runable提供一个参数,控制它等待的时间。 对于前47个流程,您需要30分钟;然后是0

    或者干脆不提交50个任务。
    相反:使用一个外部线程推送3个任务,然后等待/休眠,直到这3个任务完成。然后等待30分钟,再推一个3。

    将请求存储在集合中,而不是直接提交到线程池

    使用大小为1的ScheduledExecutorService来调度将在指定间隔后运行的任务(在您的示例中为30分钟)

    它将从集合中批量获取任务,并将其提交到另一个池中,在该池中,它实际被编程以处理提交的任务

    class CustomScheduledExecutor  {
    ScheduledExecutorService scheduleExecutor = Executors.newScheduledThreadPool(1);
    ExecutorService executorService = Executors.newFixedThreadPool(3);
    
    Queue<Runnable> queue = new ConcurrentLinkedQueue<Runnable>();
    
    public CustomScheduledExecutor(){
        scheduleExecutor.scheduleWithFixedDelay(new Runnable() {
    
            @Override
            public void run() {
                for(int i=0;i<3;i++){
                    Runnable poll = queue.poll(); // Do the handling for queue size
                    executorService.submit(poll);
                }
            }
        }, 1000, 30, TimeUnit.MINUTES);
    }
    
    public void submitTask(Runnable runnable){
        queue.offer(runnable);
    }
    
    }
    
    类CustomScheduledExecutor{
    ScheduledExecutorService scheduleExecutor=执行者。newScheduledThreadPool(1);
    ExecutorService ExecutorService=Executors.newFixedThreadPool(3);
    Queue Queue=新的ConcurrentLinkedQueue();
    公共CustomScheduledExecutor(){
    scheduleExecutor.scheduleWithFixedDelay(新的可运行(){
    @凌驾
    公开募捐{
    
    对于(int i=0;iWhy you want to run in the there process in first place?您还可以使用一个不同的类加载器,并将所有已经运行的东西都保存在JVM中?只需说..@GhostCat,谢谢您的回复。但实际的业务逻辑位于这个jar processinitate.jar中(在运行时为其分配一些最小和最大内存)(java-jar-xms512m-xmx2048md:\processinitate.jar)。这是一个长时间运行的进程,将为此消耗更多内存。这是一个进程必须由池进行监视,直到完成。我不能给单个可运行进程30分钟的时间,池必须在3个进程完成后等待。一旦3个进程完成..等待30分钟..下3个进程必须由池执行,依此类推。实际的业务逻辑is驻留在这个jar processinitate.jar中(在运行时为它分配一些最小和最大内存)(java-jar-xms512m-xmx2048md:\processinitate.jar)。这是一个长时间运行的进程,将为此消耗更多内存。这是一个必须由池监视的进程,直到完成为止。@Rajasekhar___1989欢迎您提供一些反馈。我给了您两种方法;但既不向上投票,也不接受;甚至没有评论“我需要更多帮助,因为”长话短说:其他人花时间帮助你,所以考虑一下给他们一点反馈吧!
    class CustomScheduledExecutor  {
    ScheduledExecutorService scheduleExecutor = Executors.newScheduledThreadPool(1);
    ExecutorService executorService = Executors.newFixedThreadPool(3);
    
    Queue<Runnable> queue = new ConcurrentLinkedQueue<Runnable>();
    
    public CustomScheduledExecutor(){
        scheduleExecutor.scheduleWithFixedDelay(new Runnable() {
    
            @Override
            public void run() {
                for(int i=0;i<3;i++){
                    Runnable poll = queue.poll(); // Do the handling for queue size
                    executorService.submit(poll);
                }
            }
        }, 1000, 30, TimeUnit.MINUTES);
    }
    
    public void submitTask(Runnable runnable){
        queue.offer(runnable);
    }
    
    }