我有3種類型的任務:A, B, C
。定製多線程:限制了一些類型的任務的數目,以並行執行,而不限制其它類型的任務
而且我想在N個線程並行運行這些任務。讓我們假設,即任務列表如下:
A, B, C, B, C, A, B, C
當然,我可以實現使用ExecutorService
多線程執行,但問題是,我需要C
型最多一個任務同時被執行。類型爲C
的其他任務必須按順序執行,但與任務A
和/或B
並行執行。
例如3線程執行主體可以是任何以下狀態:
A B C
A A A
A C B
B B C
B B B
B C
A C
A B
C
...
(它被允許在一個時間執行類型A或B的多個任務,但至多一個任務 C型必須一次)
是否有某種方式在Java中實現這一目標被執行?
更新
這是我有川方有了這個做這個 在這裏,我通過ExecutorService
執行所有任務的正確方法雖然執行我會檢查是否有任何其他C任務是Running.If不是我會執行不然我會添加到隊列,將任何其他任務的順利完成出隊,也是我檢查任何C任務正在運行或不
public class Test {
public void startExecution() {
Queue<String> runQ = new LinkedList<>();
ThreadPool exec = (ThreadPool) Executors.newFixedThreadPool(RunSettings.getRunSettings().getThreadCount());
while (!runQ.isEmpty() && !SystemDefaults.stopExecution.get()) {
String TaskName = runQ.remove();
Task t = new Task(TaskName);
exec.execute(t, TaskName);
}
exec.shutdown();
if (exec.awaitTermination(RunSettings.getRunSettings().getExecutionTimeOut(), TimeUnit.MINUTES)) {
System.out.println("[CONTROL: ALL TEST TASKS COMPLETED SUCCESSFULLY.]");
} else {
System.out.println("[CONTROL: ALL THE TEST TASKS DID NOT COMPLETE SUCCESSFULLY IN STIPULATED TIME. FORCEFULLY FINALIZING.]");
exec.shutdownNow();
}
}
}
線程池什麼我創建了
public class ThreadPool extends ThreadPoolExecutor {
public ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
final String CTask = "TaskC";
Map<Runnable, String> TaskPool = new HashMap<>();
Queue<Runnable> TaskCList = new LinkedList<>();
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (TaskPool.containsKey(r)) {
TaskPool.remove(r);
}
if (!TaskPool.containsValue(CTask) && !TaskCList.isEmpty()) {
Runnable ieRun = TaskCList.remove();
super.execute(ieRun);
TaskPool.put(ieRun, CTask);
}
}
public void execute(Runnable command, String TaskType) {
if (TaskPool.containsValue(TaskType)
&& TaskType.equalsIgnoreCase(CTask)) {
System.out.println("Another Instance of " + CTask + " Running");
TaskCList.add(command);
} else {
super.execute(command);
TaskPool.put(command, TaskType);
}
}
}
你怎麼有'AAA', AB和'BBB'在這裏沒有'C'? – TheLostMind
@TheLostMind列表中也可以沒有C任務以及..在那種情況下,這是正確的事 – Madhan
@SashaSalauyou如果我創建兩個單獨的例如說,我有50個總計任務23 A 23 B 4 C我想讓他們在3個線程,然後根據你的情況,A和B將總是運行在兩個線程中,並且分配給C的線程不能被重用。或者可以在執行後增加池大小 – Madhan