如何将线程添加到ArrayList

时间:2014-07-01 18:41:39

标签: java multithreading arraylist

我有一个类,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跟踪线程的方式是否可行或者是......愚蠢的? 我该怎么办?欢迎任何有关如何实现此模拟器的想法

2 个答案:

答案 0 :(得分:0)

这很好。如果QueueManager是单线程的,那么任何Queue,LinkedList或ArrayList都可以正常工作。

答案 1 :(得分:0)

评论中指出的问题不仅仅是一件美化事物。制作Thread的子类会导致错误的思考,这可以通过你的问题得到很好的证明。

访问变量的线程与保存变量的对象没有任何关系,即使该对象恰好是Thread的实例。创建Thread的子类并将实例变量放入其中会导致错误地认为Thread实例表示的线程与该实例的变量之间存在关系。

有问题的是,您在询问是否可以将这些实例放入ArrayList,当然,您可以这样做,因为Thread的实例与此无关。

但鉴于您对要做的事情的描述不完整,似乎您将至少有一个线程通过LinkedList<Client>通过sQueue访问QManager中的SmartQueue而另一个线程(成为你的LinkedList实例代表但仍然无关紧要的那个也将会这样做。除非您采取措施实现对SmartQueue的线程安全访问,否则这将会中断。因此,您只关注线程安全的错误位置,因为Thread扩展了{{1}} ...