我有一个类,SmartQueue,它扩展了Thread,看起来像这样
public class SmartQueue extends Thread {
public int idQ;
public LinkedList<Client> sQueue = new LinkedList<Client>();
......
//pops an element from sQueue after a random time in a specified interval
//and then waits to be notified again
从另一个类,QManager我想在for循环中创建一些SmartQueue线程,并通过将它们添加到ArrayList来跟踪它们。然后在另一个指定的时间间隔内的某个随机时间在SmartQueue.sQueue中一次添加一个元素。此外,在QQ类中也会触发SmartQueue中元素的移除,即“从ArrayList中提取”线程并通知它。
基本上我正在尝试创建一个队列模拟器,其中生成的“客户端”到达并在/随机时间服务,每个队列都有自己的处理器,并与其他队列同时作为线程运行
ArrayList跟踪线程的方式是否可行或者是......愚蠢的? 我该怎么办?欢迎任何有关如何实现此模拟器的想法
答案 0 :(得分:0)
这很好。如果QueueManager是单线程的,那么任何Queue,LinkedList或ArrayList都可以正常工作。
答案 1 :(得分:0)
评论中指出的问题不仅仅是一件美化事物。制作Thread
的子类会导致错误的思考,这可以通过你的问题得到很好的证明。
访问变量的线程与保存变量的对象没有任何关系,即使该对象恰好是Thread
的实例。创建Thread
的子类并将实例变量放入其中会导致错误地认为Thread
实例表示的线程与该实例的变量之间存在关系。
有问题的是,您在询问是否可以将这些实例放入ArrayList
,当然,您可以这样做,因为Thread
的实例与此无关。
但鉴于您对要做的事情的描述不完整,似乎您将至少有一个线程通过LinkedList<Client>
通过sQueue
访问QManager
中的SmartQueue
而另一个线程(成为你的LinkedList
实例代表但仍然无关紧要的那个也将会这样做。除非您采取措施实现对SmartQueue
的线程安全访问,否则这将会中断。因此,您只关注线程安全的错误位置,因为Thread
扩展了{{1}} ...