Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何向ArrayList添加线程_Java_Multithreading_Arraylist - Fatal编程技术网

Java 如何向ArrayList添加线程

Java 如何向ArrayList添加线程,java,multithreading,arraylist,Java,Multithreading,Arraylist,我有一个类,SmartQueue,它扩展了线程,如下所示 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 interva

我有一个类,SmartQueue,它扩展了线程,如下所示

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 
公共类SmartQueue扩展线程{
公共国际数据中心;
public LinkedList squee=new LinkedList();
......
//在指定间隔内的随机时间后从sQueue中弹出一个元素
//然后等待再次收到通知
从另一个类QManager中,我想在for循环中创建几个SmartQueue线程,并通过将它们添加到ArrayList来跟踪它们。然后在另一个指定的时间间隔内的某个随机时间在SmartQueue.sque中一次添加一个元素。此外,在类QManager中删除SmartQueue中的一个元素也会由。。。从ArrayList中“提取”线程并通知它

基本上,我正在尝试创建一个队列模拟器,其中生成的“客户机”在某个随机时间到达并提供服务,每个队列都有自己的处理器,并作为线程与其他队列同时运行

ArrayList跟踪线程的方法是可行的还是…只是愚蠢?
我该怎么做呢?欢迎大家提出任何关于如何实现这个模拟器的想法。这很好。只要队列管理器是单线程的,任何队列、LinkedList或ArrayList都可以工作。

评论中指出的问题不仅仅是一件装饰性的事情。创建
线程的子类会导致错误的想法,而你的问题很好地说明了这一点

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

您询问是否可以将这些实例放入
ArrayList
,当然,您可以这样做,因为它们是
Thread
的实例在这里没有相关性


但是,鉴于您对要执行的操作的描述不完整,似乎至少会有一个线程通过
QManager
访问
sQueue
中保存的
LinkedList
,而另一个线程(恰好是由
SmartQueue
实例表示的线程,但这仍然不相关)也可以。除非您采取措施实现对
LinkedList
的线程安全访问,否则这将中断。因此,您在线程安全方面的关注点是错误的,因为您的
SmartQueue
extends
thread

是SmartQueue还是线程?确实有理由扩展线程吗?是的,SmartQueue是一个线程。SmartQueue的每个实例都是一个线程,所有实例都应该同时运行@svenoaks可能想说的是,扩展线程是20世纪定义线程入口点的方式。21世纪的方式是实例化裸线程类,并给它一个可运行的委托。
new thread(new Runnable(){public void run(){…}})
长期的好处是,它使您养成了使用委托而不是使用类型继承的习惯——这是编写干净、可重用、可维护代码的一个步骤。是的,我知道使用Runnable更好,但是……说实话,我对线程没有太多的工作,我发现使用Runnable有点困难,但我得到了comfortable使用线程非常快,我的意思是它基本上只是继承。我同意,这有长期的好处,但我没有太多的时间,我需要尽快完成这项工作,这是大学的一项评估。这样更容易。代码以后不会被重用或以任何主要方式维护。更有可能会被遗忘。之后rwards我将尝试一些个人项目,并在那里开始使用Runnable。无论如何,谢谢!好的,但是…使用Runnable可以让我将每个线程视为一个单独的SmartQueue实例,并带有它自己的变量吗?如果不可以,我该怎么做?首先可以吗?线程不是SmartQueue的实例。永远不会。这就是重点,making
SmartQueue
线程
Thread
的子类使您认为存在根本不存在的关系。使用
Runnable
可以帮助您理解线程只执行一个操作,即
run
方法中的代码,仅此而已。所包含的变量是否由一个或多个访问线程取决于整个应用程序逻辑。如前所述,您的(模糊的)描述表明您希望通过多个线程访问数据。因此您必须使它们具有线程安全性。是的,好的,我明白了,线程基本上不是对象,它们只是……”做点什么“。我想做的是…将每个线程绑定到同一类的某个实例,这样每个线程都可以操作并修改某个类的某个实例(
SmartQueue
)的变量(
squee
)。在循环中按顺序执行非常容易,但我正在尝试同时执行此操作。”(…至少从软件的角度来看),我有点糊涂了,我真的不知道怎么做给每个线程分配一个它应该处理的对象是没有问题的。你只需要把它传递给
Runnable
,或者你甚至可以让
SmartQueue
实现
Runnable
,这样它的
run
方法自然会处理正确的对象将对象分配给工作线程不会自动阻止其他线程访问同一对象。您必须正确设计应用程序。据我所知,您希望线程从其队列中获取并处理项目,但有其他人正在放置项目。因此,您需要使用线程安全的q尤埃。