如果先决条件尚未完成处理,如何让线程等待并在先决条件完成后恢复?
How to make thread wait if prerequisite was not yet done processing and resumes once prerequisite is finished?
我是 Java 多线程的新手。
我想执行一个流程执行程序。
每个进程包含零到多个先决条件(进程字符串列表)
我的目标是运行一件一件地处理。
如果当前线程先决条件尚未完成,它将等待并在其所有先决条件过程完成执行后恢复。
我不确定这是否可行。
希望您能够帮助我。请帮助我让它更简单易懂。
我当前的程序输出是:
线程开始备份
线程启动传输报告
线程启动存档报告
线程工作备份
线程等待传输报告
线程等待存档报告
线程完成备份
添加备份到完成的过程。
我的预期输出:
线程开始备份
线程启动传输报告
线程启动存档报告
线程工作备份
线程等待传输报告
线程等待存档报告
线程完成备份
添加备份到完成的过程。
线程作品传输报告
线程完成传输报告
将传输报告添加到完成的流程。
线程作品存档报告
线程完成存档报告
将存档报告添加到完成的过程。
== 结束 ==
以下是我当前的代码:
主要应用程序
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 对象
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;
}
}
我简化了我的实现。
在我的可调用对象中,我做了这些。
@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();
}
谢谢大家的帮助!
我是 Java 多线程的新手。 我想执行一个流程执行程序。 每个进程包含零到多个先决条件(进程字符串列表)
我的目标是运行一件一件地处理。 如果当前线程先决条件尚未完成,它将等待并在其所有先决条件过程完成执行后恢复。
我不确定这是否可行。 希望您能够帮助我。请帮助我让它更简单易懂。
我当前的程序输出是: 线程开始备份 线程启动传输报告 线程启动存档报告 线程工作备份 线程等待传输报告 线程等待存档报告 线程完成备份 添加备份到完成的过程。
我的预期输出: 线程开始备份 线程启动传输报告 线程启动存档报告 线程工作备份 线程等待传输报告 线程等待存档报告 线程完成备份 添加备份到完成的过程。 线程作品传输报告 线程完成传输报告 将传输报告添加到完成的流程。 线程作品存档报告 线程完成存档报告 将存档报告添加到完成的过程。 == 结束 ==
以下是我当前的代码:
主要应用程序
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 对象
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;
}
}
我简化了我的实现。 在我的可调用对象中,我做了这些。
@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();
}
谢谢大家的帮助!