4

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

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

e.g.
ThreadA.getState();

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

谢谢。

4

4 回答 4

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...
   }
}
于 2012-06-25T18:11:19.247 回答
2

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

于 2012-06-26T06:18:06.837 回答
1

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

这就是为什么没有修改线程状态的机制。没有setState允许设置自定义状态的功能。

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

于 2012-06-25T18:19:50.947 回答
1

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

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

如果您有消息传递设计(如 zaske 建议的那样),您可以在每个线程的输入队列中传递“状态记录”,要求它在内部记录其状态并将其传递给下一个线程。'monitor' 线程等待记录回来,全部填写。如果它在合理的时间内没有得到它,它可以记录它所得到的——它保持对状态记录对象的引用,所以它可以看到哪个线程尚未更新其状态。它可能无法提供看门狗定时器。

于 2012-06-26T09:56:33.110 回答