【发布时间】:2014-08-22 10:06:40
【问题描述】:
我有一个类,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 中一次添加一个元素。此外,SmartQueue 中元素的删除也将在 QManager 类中触发,方法是...从 ArrayList 中“提取”线程并通知它。
基本上,我正在尝试创建一个队列模拟器,其中生成的“客户端”到达并在/在某个随机时间提供服务,每个队列都有自己的处理器并与其他队列同时作为线程运行
ArrayList 跟踪线程的方式是可行的还是......只是愚蠢的? 我该怎么做?也欢迎任何关于如何实现这个模拟器的想法
【问题讨论】:
-
SmartQueue 是线程吗?真的有理由扩展 Thread 吗?
-
是 SmartQueue 是一个线程。 SmartQueue 的每个实例都是一个线程,所有实例都应该并发运行
-
@svenoaks 可能想说的是,扩展 Thread 是 20 世纪定义线程入口点的一种方式。 21 世纪的方式是实例化裸线程类,并给它一个 Runnable 委托。
new Thread(new Runnable() { public void run() { ... }});长期的好处是它让你养成使用委托而不是使用类型继承的习惯——在编写干净、可重用、可维护的代码的道路上迈出了一步。 -
是的,我知道使用 Runnable 更好,但是……说实话,我对线程的工作并不多,我发现使用 Runnable 有点困难,但我很快就适应了使用线程,我的意思是它基本上只是继承。我同意,这是有长期利益的,但我没有太多时间,我需要快速完成这项工作,这是大学的评估。这种方式更容易。代码不会以任何主要方式被重用或维护。更有可能会被遗忘。之后我会尝试一些个人项目,并在那里开始使用 Runnable。无论如何,谢谢!
标签: java multithreading arraylist