【问题标题】:How to use two threads in one function?如何在一个函数中使用两个线程?
【发布时间】:2012-01-28 23:38:22
【问题描述】:

这里我有一个 checkupdate() 功能,其中我的应用程序检查可供用户使用的更新,所以我需要在服务器处于请求状态时显示两个进度对话框(检查过程),另一个在同步过程正在进行时显示两个进程在应用程序的负载上完成。 现在的问题是我无法显示这两个进度对话框,这里只有第一个线程检查更新正在运行并且应用程序被终止。 等待您的宝贵答案。

public void CheckUpdate()
{ 

//----------------Process of checking the updates--------------------------

        try
            {
            progressDialog = ProgressDialog.show(this, "Wait", "Checking update...", false, true);
            Thread thr1 = new Thread() 
             {
                 public void run()
                 {
                     int Flag = call.CheckUserUpdate(UsrId);
                     Update = Flag;
                     progressDialog.dismiss();
                     //stop();
                     interrupt();

                 }
             };
             thr1.start();
            }
            catch(final Exception e)
            {

            }
    //---------------Process of Synchronization----------------------------------------------        
            try
            {
             progressDialog1 = ProgressDialog.show(this, "Wait", "Synchronizing...", false, true);
             Thread thr2 = new Thread() 
             {
                 public void run()
                 {
                     if(Update == 1)
                     {
                        SyncData();
                        final int UpdateFlag = 1;
                        call.UpdateUserUpdate(UsrId, UpdateFlag);
                        progressDialog1.dismiss();
                    }
                    else
                    {
                        progressDialog1.dismiss();
                    }
                     progressDialog1.dismiss();
                 }
             };
             thr2.start();
            }
            catch(final Exception e)
            {

            }
}

【问题讨论】:

    标签: java android multithreading thread-safety threadpool


    【解决方案1】:

    启动新线程会导致它们开始在其他地方执行。您的程序在这里启动了两个线程,到达main() 的末尾并退出,导致 JVM/OS 杀死您新启动的线程,这些线程从未真正有机会运行很远。

    假设您在主线程上没有任何工作发生,您需要添加一个空闲循环(或类似的循环),该循环在主线程上产生控制权,同时工作线程对其事物进行控制。

    【讨论】:

      【解决方案2】:

      我是否正确理解你想要什么?

      您的 UI 活动有两个进度条,应根据其中一个进行更新

      1. 更新检查流程
      2. 同步过程

      那么您应该在您的 UI 活动中创建一个handler,并使用两个单独的线程,一个用于更新检查,另一个用于同步检查

      两者都将进度信息发送到主线程,例如:

      mHandler.obtainMessage(Main_screen.MESSAGE_PGROGRESS_CHANGE_UPDATE, state, -1)
          .sendToTarget();
      

      在另一个你有

      mHandler.obtainMessage(Main_screen.MESSAGE_PGROGRESS_CHANGE_SYNCHRINIZATION, state, -1)
          .sendToTarget();
      

      在您的 UI 活动中,您的处理程序看起来像这样......

       private final Handler mHandler = new Handler() {
          @Override
          public void handleMessage(Message msg) {
              if (DEBUG)
              Log.i(this.getClass().getSimpleName(),
                  "-> "
                      + Thread.currentThread().getStackTrace()[2]
                          .getMethodName());
              switch (msg.what) {
              case MESSAGE_PGROGRESS_CHANGE_UPDATE:
              if (DEBUG)
                  Log.i(this.getClass().getSimpleName(),
                      "  MESSAGE_PGROGRESS_CHANGE_UPDATE: " + msg.arg1);
      
              // do your update of progressbar or whatever here
              break;
                  case MESSAGE_PGROGRESS_CHANGE_SYNCHRINIZATION:
              if (DEBUG)
                  Log.i(this.getClass().getSimpleName(),
                      "  MESSAGE_PGROGRESS_CHANGE_SYNCHRINIZATION: " + msg.arg1);
      
              // do your update of progressbar or whatever here
              break;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多