自定义状态的线程

时间:2012-06-25 17:56:13

标签: java android multithreading

在Java(Android)中是否可以实现一个带有自己状态的Thread的自定义版本?

我的意思是: 当ThreadA处于Running状态时,仍然可以通过ThreadB轮询它询问其状态

e.g.
ThreadA.getState();

可以将状态值修改为某些自定义值吗?那么在这两个线程之间实现一种基本的通信系统呢?

感谢。

4 个答案:

答案 0 :(得分:5)

是的,这是可能的。我在以前的项目中经常使用这个,所有你需要的是扩展Thread类。

public class StateThread extends Thread{
   String state = "ThreadState";
   public synchronized void setState(String newState){
      state = newState;
   }
   public synchronized String getState(){
      return state;
   }
   @override
   public void run(){
      // Do stuff and update state...
   }
}

答案 1 :(得分:2)

是的,可以执行此任务。
这是一个好的设计吗?我不这么认为。
还有其他方法可以在线程之间进行通信 -
例如,您应该使用具有生产者/消费者模式的队列。
我确信Android,因为JavaSE支持本地线程 - 您可以使用它来管理本地线程数据(包括状态)(可能与一个队列结合使用“操作”来改变线程管理的状态
如果你决定采用setState和getState方法的解决方案,至少考虑使用ReaderWriterLock来优化你的锁定

答案 2 :(得分:1)

线程状态由虚拟机维护。 VM使用状态来监视和管理实际线程。

这就是为什么没有机制来修改Thread的 state 。没有允许设置自定义状态的setState函数。

出于应用目的,您可以通过扩展Thread来定义自己的实例变量,但不能以任何方式改变Thread的状态。

答案 3 :(得分:1)

与共享数据同步对于确定线程的“状态”并不是非常有用 - 线程将其状态写为“正常”,然后卡住 - 监控线程然后检查状态并发现它健康。

监控'state'应该意味着让被检查的线程做一些事情,而不仅仅是直接查看某个共享对象。

如果你有一个消息传递设计(如zaske所建议的那样),你可以在evey线程的输入队列上传递一个'状态记录',要求它在里面记录它的状态并将其传递给下一个线。 'monitor'线程等待记录返回,全部填写。如果它没有在合理的时间内得到它,它可以记录它已经得到的东西 - 它保持对状态记录对象的引用,所以它可以看到哪个线程没有更新其状态。也许,它可能无法提供看门狗定时器。