gpt4 book ai didi

java - 异步拆分 IProgressMonitor

转载 作者:太空宇宙 更新时间:2023-11-04 12:08:58 25 4
gpt4 key购买 nike

我想创建自己的 ISearchQuery,将实际搜索委托(delegate)给其他几个搜索。我预计只有其他搜索之一会真正找到一些内容,这就是我想异步运行它们的原因。

但是我正在为如何实现这一目标而苦苦挣扎。 Eclipse 中的标准方法可能是使用作业:

@Override
public IStatus run(final IProgressMonitor monitor) throws OperationCanceledException {
for (Delegate delegate : delegates) {
Job job = new Job(delegate.getName()) {

@Override
protected IStatus run(IProgressMonitor monitor) {
delegate.run(monitor);
return Status.OK_STATUS;
}
};
job.schedule();
}
return Status.OK_STATUS;
}

这是异步的,但这里的问题是,由于每个作业都有自己的 IProgressMonitor,因此父级搜索无法获取有关进度如何进行的任何信息(作业完成时“完成”除外)。另外,我不确定这些作业是否同时执行,从我所看到的来看,它们通常是一个接一个执行的。

我找到了SubMonitor看起来很有希望:

@Override
public IStatus run(final IProgressMonitor monitor) throws OperationCanceledException {
SubMonitor subMonitor = SubMonitor.convert(monitor, delegates.size());
for (Delegate delegate : delegates) {
SubMonitor delegateMonitor = subMonitor.split(1);
delegate.run(delegateMonitor);
}
return Status.OK_STATUS;
}

但是现在我正在努力解决如何让它异步工作。

我也许可以将这两种方法结合起来,忽略作业的IProgressMonitor,但这感觉就像作弊。

IProgressMonitor 拆分为异步任务的最佳方法是什么?

最佳答案

我自己没有遇到过这样的情况,所以我的想法没有实践经验的支持。

我的第一个选择是安排一个作业并在所有异步任务之间共享一个进度监视器。任务只允许报告已完成的工作量(即调用 worked())。 beginTask()done() 只会从作业中调用,如第二个代码段中所示。

除了 FutureProgressMonitor 之外,我遇到的所有 IProgressMonitor 实现似乎都不是线程安全的。

因此,您需要实现一个线程安全的包装器。或者查看 FutureProgressMonitor 是否适合。

此外,作业需要等待所有任务完成。也许从作业的 run() 方法返回 Job.ASYNC_FINISH 也可以,但到目前为止我自己还没有使用过。

关于java - 异步拆分 IProgressMonitor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40058924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com