如何启动在java中按顺序运行的三个任务?

如何启动在java中按顺序运行的三个任务?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我试着开始三项任务:第一项任务将阅读一些电子邮件,完成后将启动一项基于这些电子邮件生成一些图形的服务,最后这些图形将作为电子邮件上的zip文件发送。 这些任务必须按以下精确顺序运行: dataReader->graphGenerator->emailSender 我实现了这个服务,但我不明白为什么它不起作用 @Component public class WeeklyEmailService { @Autowired private EmailSender emailSender

我试着开始三项任务:第一项任务将阅读一些电子邮件,完成后将启动一项基于这些电子邮件生成一些图形的服务,最后这些图形将作为电子邮件上的zip文件发送。 这些任务必须按以下精确顺序运行:

dataReader->graphGenerator->emailSender

我实现了这个服务,但我不明白为什么它不起作用

@Component
public class WeeklyEmailService {
    @Autowired
    private EmailSender emailSender;
    @Autowired
    private GraphGenerator graphGenerator;
    @Autowired
    private DataReader dataReader;
    @Autowired
    private CompanyRepository companyRepository;
    @Autowired
    private EmailConfigurer emailConfigurer;
    @Value("${mail.username}")
    private String username;
    @Value("${mail.password}")
    private String password;

    public void sendWeeklyEmail() {
        emailConfigurer.setUsername(username);
        emailConfigurer.setPassword(password);
        if (emailConfigurer.configure() != null) {
            System.out.println("Connection successfully established with mail server!");
        }
        Task<Void> reader = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                dataReader.readWeeklyEmails();
                return null;
            }
        };

        Task<Void> generator = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                companyRepository.getCompanyNames().forEach(company -> {
                    graphGenerator.generateGraphs(new DateTime().minusWeeks(1), new DateTime(), company);
                });
                return null;
            }
        };

        Task<Void> emailTask = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                emailSender.sendMailWithAttachment();
                return null;
            }
        };
        reader.setOnSucceeded(event -> {
            Thread generatorThread = new Thread(generator);
            generatorThread.start();
        });
        generator.setOnSucceeded(event -> {
            Thread emailThread = new Thread(emailTask);
            emailThread.start();
        });
        emailTask.setOnSucceeded(event -> {
            if (clean()) {
                System.out.println("Graphs Reports and ZIP files deleted from your computer");
            } else {
                System.out.println("Files which you want to delete do not exists");
            }
        });
        Thread readerThread = new Thread(reader);
        readerThread.start();
    }

    private boolean clean() {
        boolean cleaned = false;
        try {
            cleaned = Files.deleteIfExists(Paths.get("graphs"));
            cleaned = Files.deleteIfExists(Paths.get("reports"));
            cleaned = Files.deleteIfExists(Paths.get("zip"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return cleaned;
    }
}
@组件
公共类周邮服务{
@自动连线
私人邮件发送者;
@自动连线
私人石墨发电机;
@自动连线
专用数据阅读器;
@自动连线
私人公司储蓄公司储蓄;
@自动连线
专用EmailConfigurer EmailConfigurer;
@值(“${mail.username}”)
私有字符串用户名;
@值(“${mail.password}”)
私有字符串密码;
公开作废sendWeeklyEmail(){
emailConfigurer.setUsername(用户名);
emailConfigurer.setPassword(密码);
if(emailConfigurer.configure()!=null){
System.out.println(“与邮件服务器成功建立连接!”);
}
任务读取器=新任务(){
@凌驾
受保护的Void调用()引发异常{
dataReader.readWeeklyEmails();
返回null;
}
};
任务生成器=新任务(){
@凌驾
受保护的Void调用()引发异常{
companyRepository.getCompanyNames().forEach(公司->{
graphGenerator.GenerateGraph(新日期时间().minusWeeks(1),新日期时间(),公司);
});
返回null;
}
};
任务emailTask=新任务(){
@凌驾
受保护的Void调用()引发异常{
emailSender.sendMailWithAttachment();
返回null;
}
};
reader.setonSucceed(事件->{
螺纹生成器读取=新螺纹(生成器);
generatorThread.start();
});
generator.SetOnSucceed(事件->{
线程emailThread=新线程(emailTask);
emailThread.start();
});
emailTask.setOnSucceeded(事件->{
if(clean()){
System.out.println(“从计算机上删除的图形报告和ZIP文件”);
}否则{
System.out.println(“要删除的文件不存在”);
}
});
线程读取器线程=新线程(读取器);
readerThread.start();
}
私有布尔清除(){
布尔值=假;
试一试{
cleaned=Files.deleteIfExists(path.get(“graphs”);
cleaned=Files.deleteIfExists(path.get(“报告”);
cleaned=Files.deleteIfExists(path.get(“zip”);
}捕获(IOE异常){
e、 printStackTrace();
}
返回清洁;
}
}

如果有更好的方法,请告诉我,谢谢

以下是一些导致相同行为的代码:
简化,井然有序,但无错误处理

Thread sendWeeklyEmailThread = new Thread(new Runnable(){
    public void run()
    {
        readWeeklyEmails();
        generateGraphs();
        sendMailWithAttachment();
        clean(); //cleanup....
    }
});
sendWeeklyEmailThread.start();

您还可以阅读更多关于
CompletableFuture
的信息,因为它更有用,更易于维护。然后阅读关于执行器服务的内容,因为最好的选择是预定义线程数

例如:

final ExecutorService executorService = Executors.newFixedThreadPool(1);

new CompletableFuture<String>().supplyAsync(() ->  dataReader.readWeeklyEmails(), executorService);
如果您这样编写代码,您就有了控制任务和可能的异常的简单方法

private String readWeeklyEmails(){
    return "";
}