AsyncExecutor
我有一个 AsyncExecutor
定义如下:
asyncExecutor = new AsyncExecutor(1);
AsyncExecutor
的构造函数是AsyncExecutor(int maxConcurrent)
,而 maxConcurrent
是多少 AsyncTask
s 允许在一个时间点并排运行。如果设置为 1,则应该运行所有 AsyncTask
它按照添加的顺序包含在其中。
AsyncTask
我正在实现 AsyncTask
我创建的一个类上的接口(interface),用于处理一组需要按照它们的顺序一个一个运行的逻辑 submit
泰德到AsyncExecutor
—通过调用 submit
AsyncExecutor
上的方法:
private class Foo implements AsyncTask<Object>
{
// ...
public Foo()
{
// Transfers variables over
}
@Override
public Object call() throws Exception
{
System.out.println("Start");
// Does some stuff here
System.out.println("Stop");
return null;
}
}
然后我submit
这些Foo
在 asyncExecutor
上每隔一段时间,并要求它们从添加时起按顺序运行。大多数情况下都是这种情况,但让我们看看控制台输出——每隔一段时间,情况并非如此:
...
Start
Stop
Start
Stop
Start
Start
Stop
Start
Start
Stop
有什么我遗漏的吗?这显然应该永远不会在彼此相邻的两行中说明“开始”,也不会在这件事上说明“停止”。
也许有人能给我指出正确的方向?
最佳答案
我想您在 AsyncTask 实现中有一个未捕获的异常。因为在您的 AsyncTask.call
实现中没有异常屏障,线程将在尝试时死掉。这就是为什么您多次出现 Start 而不是 Stop 的原因。
您可以向您的 System.out.println()
添加一些参数作为指示,以了解是否发生这种情况。
作为解决方案,只需为 Throwable 添加一些带有打印行的 try-catch 到您的 Foo 类。
我用来测试的例子:
public static void main(String[] args) throws InterruptedException {
AsyncExecutor asyncExecutor = new AsyncExecutor(1);
for (int i = 0; i < 100; i++) {
asyncExecutor.submit(new Foo(i));
}
Thread.sleep(10000);
}
static class Foo implements AsyncTask<Object>
{
private int i;
public Foo(int i) {
this.i = i;
}
@Override
public Object call() throws Exception
{
try{
System.out.println("Start" + i + "/" + Thread.currentThread().getName());
if((this.i % 9) == 0){
throw new Exception("Ugly.");
}
System.out.println("Stop " + i + "/" + Thread.currentThread().getName());
} catch (Throwable t){
t.printStackTrace();
}
return null;
}
}
关于java - `AsyncExecutor` 意味着一次执行一个 `AsyncTask` 有时会同时执行两个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41819507/