`AsyncExecutor`意味着一次执行一个`AsyncTask`有时会彼此并行执行两个

时间:2017-01-24 03:25:19

标签: java multithreading libgdx

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

有什么我错过的吗?这显然应该永远不会在彼此相邻的两条线上说明“开始” - 也就是说“停止”。

也许有人可以指出我正确的方向?

1 个答案:

答案 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;
    }
}