簡體   English   中英

Java ScheduledFuture執行異步任務,直到完成

[英]Java ScheduledFuture executing asynchronous task wait until completed

為了以固定的速率異步發送大型電子郵件,我使用了ScheduledExecutorService

我有一個實現Runnable的類,該類異步發送郵件。 需要每秒調用一次,並且精確地調用x次。 對於實際發送,我使用簡單Java郵件 我調用的方法是EmailBuilder#send(mail, /* boolean async */ true)

一旦該方法被調用了x次,就會調用ScheduledExecutorService#shutdown()

我想要的是能夠確定所有計划的Runnable在哪個時間點終止,即,所有EmailBuilder#send(mail, /* boolean async */ true)調用都已返回。

我嘗試了ScheduledExecutorService#awaitTermination()並設置了一些超時時間,還嘗試了ScheduledExecutorService#awaitTermination() ScheduledFuture#get() ,但是它不起作用或拋出了一些異常。

package playground;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

import org.simplejavamail.email.Email;
import org.simplejavamail.email.EmailBuilder;
import org.simplejavamail.mailer.Mailer;
import org.simplejavamail.mailer.MailerBuilder;

public class MCVE {

    private ScheduledExecutorService scheduler;
    private SendTask sd;
    private ScheduledFuture<?> sf;
    private boolean terminateFlag = false;

    public void start() {
        sd = new SendTask();
        scheduler = Executors.newSingleThreadScheduledExecutor();
        sf = scheduler.scheduleAtFixedRate(sd, 0, 1, TimeUnit.SECONDS);
    }

    private class SendTask implements Runnable {

        @Override
        public void run() {
            Mailer mailer = MailerBuilder.withSMTPServer("smtp.gogglemail.com", 587).buildMailer();

            Email mail = EmailBuilder.startingBlank()
                .from("from@gmail.com")
                .to("to@gmail.com")
                .withSubject("Subject")
                .withPlainText("Content")
                .buildEmail();

            mailer.sendMail(mail, /* async */ true);

            if (terminateFlag) {
                sf.cancel(true);
                scheduler.shutdown();
                return;
            }
        }
    }

}

感謝您的幫助!

收集計划后收集的所有期貨,然后收集foreach get()。

sf.isCancelled()呢? 不是您要找的東西嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM