gpt4 book ai didi

java - 尝试并行运行 2 个 AsyncTasks,但它们似乎相互阻塞

转载 作者:行者123 更新时间:2023-11-29 08:51:47 25 4
gpt4 key购买 nike

我正在开发一款通过 UDP 发送传感器数据和接收连接数据的应用。本来app只发数据,只用了1个AsyncTask。但是,由于协议(protocol)更改,应用现在需要接收数据,这需要在其自己的线程上处理并触发 UI 更新,因此,我为其创建了一个新的 AsyncTask

问题:

当独立运行时,AsyncTasks 执行完美。但是,当我同时运行它们时,一个最终会完全阻塞另一个。

我尝试了什么:

最初,我使用标准的 .execute() 来启动我的 AsyncTasks。在阅读了类似的问题之后,我实现了下面的功能,希望强制并行执行:

void startAsyncTask(AsyncTask<Void, Void, Void> asyncTask) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
else
asyncTask.execute();

我希望这能奏效,然而,它并没有。这两个任务仍然相互阻塞

这可能是什么原因造成的?我的猜测可能是池大小有限,因为这两个任务以非常频繁的速率触发(也许一个任务最终控制了池,没有留下空闲线程),但话又说回来,我不完全确定。

附加代码:以下是我如何设置计时器来执行我的异步任务:

             timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {

if (dataClient.getStatus() == AsyncTask.Status.FINISHED) {
dataClient = new udpClient();
}

if (dataClient.getStatus() != AsyncTask.Status.RUNNING) {
if(sensorValues != null) {
if(isUdpEnabled)
startAsyncTask(dataClient);
}
}
}
});
}
};

timer.schedule(task, 0, 25);

timer2 = new Timer();
task2 = new TimerTask() {
@Override
public void run() {
handler2.post(new Runnable() {
public void run() {

if (broadcastClient.getStatus() == AsyncTask.Status.FINISHED) {
broadcastClient = new udpBroadcastClient();
}

if (broadcastClient.getStatus() != AsyncTask.Status.RUNNING) {
Log.d("broadcast test", "Timer fire");
startAsyncTask(broadcastClient);
Log.d("broadcast test", "After execute line reached");
}
}

});
}
};

timer2.schedule(task2, 0, 50);

最佳答案

两个线程的实际工作都被发布到同一个处理程序,这意味着它们会一个接一个地运行。如果您在 handler.post 之前放置调试语句,您会看到它们都命中该部分,然后开始顺序执行。不能只使用 new Thread(){...}.start() 吗?

关于java - 尝试并行运行 2 个 AsyncTasks,但它们似乎相互阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22472501/

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