【发布时间】:2020-05-21 23:16:52
【问题描述】:
在我的程序中,用户可以通过一个界面触发不同的任务,这需要一些时间来处理。因此它们由线程执行。到目前为止,我已经实现了它,因此我有一个带有一个线程的执行器,它一个接一个地执行所有任务。但现在我想把所有东西都并行化一点。
即我想并行运行任务,除非它们具有相同的路径,然后我想按顺序运行它们。例如,我的池中有 10 个线程,当一个任务进来时,该任务应该分配给当前正在处理具有相同路径的任务的工作人员。如果worker当前没有在处理具有相同路径的任务,则该任务应该由当前空闲的worker处理。
其他信息:任务是在本地文件系统中的文件上执行的任何类型的任务。例如,重命名文件。因此,该任务具有属性path。而且我不想同时对同一个文件执行两个任务,所以这样的路径相同的任务应该顺序执行。
这是我的示例代码,但还有工作要做:
我的一个问题是,我需要一种安全的方法来检查工作人员当前是否正在运行并获取当前正在运行的工作人员的路径。我所说的安全是指不会发生同时访问或其他线程问题。
public class TasksOrderingExecutor {
public interface Task extends Runnable {
//Task code here
String getPath();
}
private static class Worker implements Runnable {
private final LinkedBlockingQueue<Task> tasks = new LinkedBlockingQueue<>();
//some variable or mechanic to give the actual path of the running tasks??
private volatile boolean stopped;
void schedule(Task task) {
tasks.add(task);
}
void stop() {
stopped = true;
}
@Override
public void run() {
while (!stopped) {
try {
Task task = tasks.take();
task.run();
} catch (InterruptedException ie) {
// perhaps, handle somehow
}
}
}
}
private final Worker[] workers;
private final ExecutorService executorService;
/**
* @param queuesNr nr of concurrent task queues
*/
public TasksOrderingExecutor(int queuesNr) {
Preconditions.checkArgument(queuesNr >= 1, "queuesNr >= 1");
executorService = new ThreadPoolExecutor(queuesNr, queuesNr, 0, TimeUnit.SECONDS, new SynchronousQueue<>());
workers = new Worker[queuesNr];
for (int i = 0; i < queuesNr; i++) {
Worker worker = new Worker();
executorService.submit(worker);
workers[i] = worker;
}
}
public void submit(Task task) {
Worker worker = getWorker(task);
worker.schedule(task);
}
public void stop() {
for (Worker w : workers) w.stop();
executorService.shutdown();
}
private Worker getWorker(Task task) {
//check here if a running worker with a specific path exists? If yes return it, else return a free worker. How do I check if a worker is currently running?
return workers[task.getPath() //HERE I NEED HELP//];
}
}
【问题讨论】:
-
“路径”是什么意思?你是说文件路径?你应该在你的问题前面解释一下。
-
为什么要将具有相似路径的任务与具有该路径的其他任务分配给同一个工作人员?
-
@BasilBourque 是的,很抱歉我的问题中的解释较晚。是的,路径我的意思是像 C:\myfolder\mysubfolder 这样的文件路径
-
附带说明:如果您支持重命名功能,那么,突然间,该任务有两条路径......(不是试图让事情变得更复杂,不过)。
标签: java multithreading synchronization threadpoolexecutor