【问题标题】:Android/Java thread sleepingAndroid/Java 线程休眠
【发布时间】:2012-04-27 10:37:32
【问题描述】:

除了隐式用户界面线程外,我还创建了两个线程(可运行),它们内部都有一个 while 循环,我在其中定期检查我已实现的消息队列中的更新。

一开始的问题是这两个while循环是无限的,而且它们变化如此之快,如此之大,以至于几乎耗尽了设备的所有CPU。 所以我考虑让while循环在每个循环后休眠大约100毫秒,让其他线程完成他们的工作,但我遇到了另一个问题:

现在,问题是线程休眠了 100 毫秒,但它们不会让 UI 线程在此期间工作 :( 这样做会使 UI 变得迟钝。当我在屏幕上拖动某些东西时,它会延迟有点。

所以我想做的是让这些线程(这些 while 循环)每 100 毫秒检查一次消息队列标志,但在这 100 毫秒期间,我想让 UI 线程运行。如何做到这一点?

编辑 1

我找到了 yield 方法,它停止了当前线程的运行,但是我什么时候调用它呢?我需要调用睡眠线程,同时让它以某种方式产生...... ??

编辑 2

这两个类是单例的,我从应用程序的第一个 Activity 启动它们,所以当应用程序启动时(UI 线程)

//Obtain object of singleton classes
ControllerSingleton controller = ControllerSingleton.getControllerSingleton();
OpponentSingleton opponent = OpponentSingleton.getOpponentSingleton();

//Start threads
/*--------CONTROLLER----------*/
Thread t;
t = new Thread( controller );       
t.setName("ControllerThread");
Log.i("Remy","Starting Controller thread...");
t.start();

/*--------OPPONENTS----------*/
t = new Thread( opponent );     
t.setName("OpponentThread");
Log.i("Remy","Starting Opponent thread...");
t.start();

在每个run() 里面我都有下一个代码:

public void run() 
{
   while( true )
   {
      //Check if any messages in the queue
      if ( queueEmpty() == false )
      {
          //Do something ...              
      }
      /*HERE IS WHERE I WOULD LIKE TO TELL THE THREAD TO STOP AND WAIT FOR 100 ms*/
   }
}

【问题讨论】:

  • 请粘贴一些代码。您如何启动线程以及在何处启动?
  • runnable 以同步方式运行,如果您不将它们作为线程启动 (new thread(runnable).start())
  • 这听起来很像您实际上并没有开始新线程,或者您至少在其中进行 UI 更新。另外,如果您要使用yield(),请小心!它只允许其他线程在等待并且具有相同优先级时运行。
  • 查看 Edit2 以获取一些示例代码。希望够了
  • 整个设计都错了。不要在 GUI 线程中循环等待。任何时候都不要对线程间通信使用 sleep() 循环。不要将 CPU 循环用于线程间通信,除非作为一个自旋等待标志,该标志绝对肯定会被另一个内核上运行的线程快速释放。所有操作系统都提供信号机制,使您的轮询变得不必要。

标签: java android multithreading concurrency concurrent-programming


【解决方案1】:

我认为你需要使用的是Handler。例如,您可能想查看this tutorial

【讨论】:

  • HandlerThread 如果消息应该在后台线程而不是 UI 线程中处理。
  • 嗯,我希望不要对我的代码进行太多更改......但我会看看这个。谢谢。
  • 很抱歉@AndreiBogdan,但您必须更改很多代码:(
  • @AndreiBogdan 最好的事情是,一旦实现,这将简化您的代码。相信我,这很重要。正如 zapl 提到的那样,您实际上需要HandlerThread
猜你喜欢
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2020-05-23
  • 1970-01-01
相关资源
最近更新 更多