【问题标题】:sending a looping thread a message java/android向循环线程发送消息 java/android
【发布时间】:2012-05-24 00:30:21
【问题描述】:

所以我有以下线程:

  public class MyThread extends Thread
{
  Handler cHandler;
 private boolean looprunning = false;
  MyThread() {
  cHandler = new Handler();
          looprunning = true;

  }

  @Override
  public void run(){
      while (looprunning) {
          //do stuff here
        //update another system here or something else.
      }
  }

}

在这个线程的 while 循环内,我想运行一个 Runnable,当线程在该 while 循环内循环时,我将它传递给线程。我该怎么做?

【问题讨论】:

    标签: java android multithreading loops message


    【解决方案1】:

    首先请将 looprunning 标记为 volatile 以确保正确的线程可见性

    你可以使用队列

    Queue<Runnable> taskQueue = new ConcurrentLinkedQueue<Runnable>();
    @Override
    public void run(){
       while (looprunning) {
           //do stuff here
         //update another system here or something else.
         Runnable r = taskQueue.poll();
         if(r!=null)r.run();
       }
    } 
    

    您可以使用您选择的(线程安全的)队列

    【讨论】:

    • 等一下?你的意思是告诉我我不需要使用处理程序将消息发布到线程?我可以将 runnable 发送到此列表,我假设您正在使用的其中之一是线程安全的,而不是带有 looper 或执行 handler.sendmessage()
    【解决方案2】:

    Android 已经提供了一种机制来创建在执行 Runnables 的循环中运行的线程。看看HandlerThread

    【讨论】:

    • 有没有办法让 handlerthread 实际上有一个不断循环的逻辑?就像我的例子一样?我尝试了 HandlerThread,据我所知,您不想覆盖 run(),但它一次处理一条消息。所以我发送了一个像示例中一样的循环,处理程序线程锁定。
    • 对不起,我想我误解了你想要做什么。我没有意识到你想让线程循环不断地做其他事情,然后让它另外运行一些你在循环时发送给它的 Runnable。在这种情况下,@ratchetfreak 的建议似乎是合理的。
    • 非常感谢您对此的验证。当我第一次开始尝试弄清楚如何做到这一点时,我自己也犯了同样的错误。有趣的是,这与我在上一个问题上得到的答案相同,我认为就是这样。 stackoverflow.com/questions/10560166/…
    【解决方案3】:

    无论你在 run 方法中写入什么计算,当它完成后向处理程序发送消息,以及任何与 UI 相关的事情,比如更改 UI,你都这样做,就像我在做 progressdialogdismiss(); 还有一件事,如果尝试在运行中更改 UI 之类的东西,你肯定会得到泄漏窗口错误,因为你试图在非 UI 线程中更改 UI。

    final Handler handler = new Handler() {
    
            @Override
            public void handleMessage(Message msg) {
    
    
                dialog.dismiss();
    
            }
    
        };
    
    
    
                dialog = ProgressDialog.show(NewTransaction.this, "",
                        "Loading Meters...", false);
    
                new Thread() {
    
                    public void run() {
    
                        while(Condition){
    
                                      do Something
                                     }
                        handler.sendEmptyMessage(0);
    
                    }
    
                }.start();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      相关资源
      最近更新 更多