java - `AsyncExecutor` 意味着一次执行一个 `AsyncTask` 有时会同时执行两个

标签 java multithreading libgdx

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这些FooasyncExecutor 上每隔一段时间,并要求它们从添加时起按顺序运行。大多数情况下都是这种情况,但让我们看看控制台输出——每隔一段时间,情况并非如此:

...
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/

相关文章:

java - Java 类中属性的操作

c - 如果函数调用本身充当内存屏障,为什么 pthread_mutex_lock() 和 pthread_mutex_unlock() 包含内存屏障?

java - 与帧速率无关的正弦波模式

java - 包 javax.xml.stream 可从多个模块 : <unnamed>, java.xml 访问

java - 我不明白这个递归程序

windows - 多线程:事件驱动与消息驱动

c - 报告计算进度的 C 方法是什么?

opengl-es - 在 LibGDX 中渲染透明网格

kotlin - 发射大量子弹后,Box2D碰撞检测失败

JavaFX——人们怎么想?