当前位置: 首页 > 知识库问答 >
问题:

Android/Java线程Hibernate

南门野
2023-03-14

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

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

现在,问题是线程Hibernate了100毫秒,但它们不让UI线程在这段时间内工作:(这样做会使UI滞后。当我在屏幕上拖动某些内容时,它会滞后一点。

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

编辑1

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

编辑2

这两个类是单例,我从应用程序的第一个活动启动它们,所以当应用程序启动(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()中,我都有下一个html" target="_blank">代码:

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个答案

赫连冠玉
2023-03-14

我认为您需要使用的是Handler。例如,您可能想查看此教程。

 类似资料:
  • 我正在开发应用程序(Matt的traceroute windows版本http://winmtr.net/),它创建了多线程,每个线程都有自己的进程(执行ping命令)。 使用阻塞队列(在任务执行之前保留任务) 平丝。JAVA 现在如果我创建多个线程,比如在一个循环中超过500个线程,并在池执行器中执行 执行线程 我确实知道LinkedBlockingQueue在执行任务之前持有任务。每个线程的进

  • 问题内容: 我有一个应用程序,当用户要求过滤图像时会生成一个新线程。 这是我唯一要做的任务,所有任务都同等重要。 如果我请求太多并发线程(我最多希望有9个),则线程管理器将抛出 RejectedExecutionException 。 在那一刻我要做的是; 只需将被拒绝的任务添加到队列中,下次启动线程时,将检查队列以查看是否存在积压。 显而易见的问题是,如果最终任务在第一次尝试时被拒绝,它将永远不

  • 问题内容: 我的android类中有以下线程。我如何从线程中获取err的值??? 我希望该值是方法的返回值,但是对于我一生来说,我无法获得该值… 问题答案: 您可以通过两种方式实现这一目标。 在 糟糕的 方式。创建一个可变对象,如整数 列表 ,然后让Thread(可运行)写入列表。您可以在外部类/方法的列表中访问值。 使用而不是。一个可以返回值

  • 不管什么原因,我的回拨电话打不通。基本上,我将使用我创建的tcp服务器进行群组聊天。我试图在java中创建一个线程,然后使用回调将我从套接字获得的信息提供给主活动。 当前收到得错误: 客户端任务 最后,我想通过响应事件传递一个字符串,它将获得它的主要内容。

  • 问题内容: 看起来我已经搞砸了Java线程/ OS线程和解释性语言。 在开始之前,我确实了解绿色线程是Java线程,其中JVM处理线程,并且整个Java进程仅作为单个OS线程运行。因此,在多处理器系统上是没有用的。 现在我的问题是。我有两个线程A和B。每个线程都有10万行独立代码。我在多处理器系统上的Java程序中运行这些线程。每个线程都将被赋予一个本机OS线程来运行,该线程可以在不同的CPU上运

  • 每个人我对使用线程池有一个误解。实际结果与该类的API描述不同。当我在线程池中使用时,它不重用线程,线程池等待构造函数中设置的KeepAliveTime,然后杀死这个线程并创建一个新线程。当我将KeepAliveTime设置为较小值时,比如1秒或更短,它会删除一个线程并重新创建它,但如果我设置一分钟,则不会创建新线程,因为不允许创建,队列已经满,所以所有任务都会被拒绝,但KeepAliveTime