有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java试图并行运行2个异步任务,但它们似乎相互阻塞

我正在开发一个通过UDP发送传感器数据和接收连接数据的应用程序。最初,应用程序只发送数据,只使用1个异步任务。但是,由于协议更改,应用程序现在需要接收数据,这需要在它自己的线程上处理并触发UI更新,因此,我为它创建了一个新的AsyncTask

问题:

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

我试过的:

最初,我使用的是标准。execute()启动异步任务。在阅读了类似的问题后,我实现了下面的函数,希望强制并行执行:

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);

共 (1) 个答案

  1. # 1 楼答案

    两个线程的实际工作都被发布到同一个处理程序,这意味着这将导致它们一个接一个地运行。如果在处理程序之前放置调试语句。发帖后你会看到它们都击中了那个部分,然后顺序执行开始了。你就不能用新的Thread(){…}。开始()