首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果先决条件尚未完成处理,如何让线程等待,并在先决条件完成后恢复?

如果先决条件尚未完成处理,如何让线程等待,并在先决条件完成后恢复?
EN

Stack Overflow用户
提问于 2021-02-11 14:51:58
回答 1查看 31关注 0票数 0

我是Java多线程的新手。我想执行一个进程执行器程序。每个进程包含0到多个先决条件(一个进程的字符串列表)

我的目标是一个接一个地运行进程。在当前线程先决条件尚未完成的情况下,它将等待并在其所有先决条件进程完成执行后继续执行。

我不确定这是否可能。希望你能帮助我。请帮我把它弄得更简单易懂。

我当前的程序输出是:线程启动备份线程启动传输报告线程启动归档报告线程工作备份线程等待传输报告线程等待归档报告线程完成备份添加到完成的进程。

我的预期输出:线程启动备份线程启动传输报告线程启动归档报告线程工作备份线程等待传输报告线程等待归档报告线程完成备份添加到完成的进程。线程作品传输报告线程完成传输报告将传输报告添加到已完成的进程。线程works归档报告线程已完成归档报告将归档报告添加到已完成的进程。==结束==

以下是我当前的代码:

主要应用

代码语言:javascript
复制
public class ThreadApp {

    public static void main(String[] args) {
        List<EODProcess> eodProcesses = new ArrayList<>();
        eodProcesses.add(new EODProcess("Back Up", new ArrayList<String>()));
        eodProcesses.add(new EODProcess("Archive Report", Arrays.asList("Transfer Report")));
        eodProcesses.add(new EODProcess("Transfer Report", Arrays.asList("Back Up")));
        
        int count = eodProcesses.size();
        CountDownLatch latch = new CountDownLatch(count);
        CyclicBarrier barrier = new CyclicBarrier(count);
        ExecutorService pool = Executors.newFixedThreadPool(count);

        List<String> finishedProcess = new ArrayList<>();
        
        for (EODProcess eodProcess : eodProcesses) {
            pool.execute(() -> {
                try {
                    System.out.println("Thread starts " + eodProcess.getProcess());
                    Thread.sleep(1000);
                    
                    // Wait IF
                    // Process Prerequisite is not empty
                    // Process Prerequisite is not yet finished
                    while(!eodProcess.getPrerequisites().isEmpty() ||
                            !finishedProcess.containsAll(eodProcess.getPrerequisites())) {
                        System.out.println("Thread waits " + eodProcess.getProcess());
                        barrier.await();
                    }
                    
                    System.out.println("Thread works " + eodProcess.getProcess());
                    Thread.sleep(1000);
                    System.out.println("Thread finished " + eodProcess.getProcess());
                
                    System.out.println("Adding " + eodProcess.getProcess() + " to finished process.");
                    finishedProcess.add(eodProcess.getProcess());
                    
                } catch (Exception e) {
                    System.err.println("Worker thread inrerrupted " + eodProcess.getProcess());
                } finally {
                    latch.countDown();
                }
            });
        }

        try {
            // wait for the threads to be done
            latch.await();
            System.out.println("== End == ");
        } catch (InterruptedException e) {
            System.err.println("Starting interrupted");
        }
        pool.shutdown();
    }

}

EODProcess对象

代码语言:javascript
复制
public class EODProcess {

    private String process;
    
    private List<String> prerequisites = new ArrayList<>();
    
    public EODProcess(String process, List<String> prerequisites) {
        this.process = process;
        this.prerequisites.addAll(prerequisites);
    }

    public String getProcess() {
        return process;
    }

    public void setProcess(String process) {
        this.process = process;
    }

    public List<String> getPrerequisites() {
        return prerequisites;
    }

    public void setPrerequisites(List<String> prerequisites) {
        this.prerequisites = prerequisites;
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-16 13:35:10

我让我的实现变得更简单。在我的callable对象中,我这样做。

代码语言:javascript
复制
@Override
public String call() throws Exception {
    while (!ThreadApp.finishedProcess.containsAll(eodProcess.getPrerequisites())) {
        System.out.println(eodProcess.getProcess() + " still waiting for prerequisites...");
        Thread.sleep(3000);
    }
    System.out.println(eodProcess.getProcess() + " working...");
    System.out.println(eodProcess.getProcess() + " done!");
    ThreadApp.finishedProcess.add(eodProcess.getProcess());
    return eodProcess.getProcess();
}

感谢大家的帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66150025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档