1

除了隐式用户界面线程,我做了两个线程(可运行),两者都具有在其内部while循环中,我定期检查,我已经实现了一个消息队列中更新。的Android/Java线程睡眠

首先问题在于两个while循环是无限的,它们变化如此之快以致于它们几乎耗尽了设备的所有CPU。 所以我想关于做while循环睡觉大约100毫秒为单位每个周期后,让其他线程做他们的工作,但我遇到了另一个问题:

现在的问题是,线程睡眠100毫秒,但他们不会让UI线程在这段时间内工作:(而这会做的是让用户界面变得迟钝当我在屏幕上拖动一些东西时,它会滞后一点

所以我想要做的是让这些线程(这些while循环)检查消息队列标志每100毫秒,但在这100毫秒我不想让UI线程运行,这又如何实现呢?

编辑1

我找到了产量的方法,它停止当前线程的运行,但做的时候我打电话呢?我需要调用睡眠线程,同时使它产生某种...?

编辑2

这两个类是单例,以及i从应用程序的第一活动启动它们,所以当应用程序开始(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*/ 
    } 
} 
+1

请粘贴一些代码。你如何开始线程和在哪里?在同步方式 – 2012-04-27 10:39:20

+1

运行的运行。如果你不开始他们的线程(新的线程(可运行)。开始()) – Blackbelt 2012-04-27 10:40:15

+2

这听起来很像你实际上并没有开始新的线程,或者你在做UI的更新他们至少。另外,如果你打算使用yield(),那么要小心!它只允许其他线程在等待时运行,并且具有相同的优先级。 – vaughandroid 2012-04-27 10:46:07

回答

3

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

+2

和一个['HandlerThread'](http://developer.android.com/reference/android/os/HandlerThread.html)如果消息应该在后台线程而不是UI线程中处理。 – zapl 2012-04-27 10:42:38

+0

嗯,我希望不要在我的代码中改变太多......但我会看看这个。谢谢。 – AndreiBogdan 2012-04-27 10:48:55

+1

对不起@AndreiBogdan,但你必须改变你的很多代码:(的 – 2012-04-27 10:51:46