AsyncExecutor
我有AsyncExecutor
定义如下:
asyncExecutor = new AsyncExecutor(1);
AsyncExecutor
的构造函数是AsyncExecutor(int maxConcurrent)
,而maxConcurrent
是允许在一个时间点彼此并行运行的AsyncTask
个。AsyncTask
。如果它被设置为1,那么它应该按照它们被添加的顺序运行它所包含的所有AsyncTask
。
AsyncTask
我正在为我创建的类实现submit
接口,以处理需要按AsyncExecutor
submit
的顺序逐个运行的某组逻辑。 {1}} - 通过调用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
CloudBlockBlob.DownloadToStream
Image.FromStream
有什么我错过的吗?这显然应该永远不会在彼此相邻的两条线上说明“开始” - 也就是说“停止”。
也许有人可以指出我正确的方向?
答案 0 :(得分:3)
我想你在 AsyncTask 实现中有一个未被捕获的异常。因为在AsyncTask.call
实现中没有异常障碍,所以线程将会尝试死亡。这就是为什么你有多次出现开始,而不是停止。
您可以向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;
}
}