【问题标题】:Using ArrayList to Store Class which Extends Thread使用 ArrayList 存储扩展线程的类
【发布时间】:2011-08-10 20:40:56
【问题描述】:

我有一个名为Advantech 的驱动程序类,它存储在ArrayList 中。我实例化并initialize我的班级。 Advantechextends ThreadAdvantech 类有一个 run() 方法。一旦与设备建立连接,线程就会在类中启动。 (this.start();)

是否可以启动thread 然后将该类的实例存储到ArrayList 中?

当我用set(pos, class) 实例化该类并将其存储回数组列表(覆盖之前的位置)时,当我调用class.isAlive() 时,我得到NullPointerException

是否有任何替代/更好的方法来做到这一点?

我知道这听起来可能很奇怪,但我使用的是ArrayList,否则我必须创建 八个 类来启动 八个 线程,例如:

Advantech adv1;
Advantech adv2;
Advantech adv3;
Advantech adv4;

每个实例的所有参数都相同。

代码:

private ArrayList<Advantech> advantech = null;
private Advantech adv = null;
....

adv = new Advantech(/* parameters */);

adv.initialize();

advantech.set(0, adv);

在 Advantech.java 中:

public class Advantech extends Thread {

    ....
    public void run() {

         while(!done) { // do some work }
    }
}

【问题讨论】:

  • 是什么阻止了你?我的意思是,是的,这是可能的。
  • @Marcelo:愚蠢的问题。我得到 NullPointerException。请再读一遍。这就是为什么我要问如何正确地做到这一点。
  • 请贴一些代码;这应该工作。
  • 您应该将代码发布到您调用isAlive 的位置。我怀疑你是从另一个线程调用它,在这种情况下你应该使用一些并发列表而不是普通的 ArrayList。

标签: java multithreading arraylist


【解决方案1】:

除非我错过了什么(或者你只是没有发布它),否则你似乎没有在任何地方构建你的ArrayList&lt;Advantech&gt;。在使用它之前你需要这条线:

// Here, numOfThreads is an int variable that specifies how many threads you want to store
advantech = new ArrayList<Advantech>(numOfThreads);

此外,您可能希望将列表重命名为更具描述性的名称(可能是advantechThreadList。)

【讨论】:

  • 已经好几年没用过 Java 了。。我还在努力。这就是问题所在。
【解决方案2】:

这样的事情应该可以工作:

List<Advantech> threads = new ArrayList<Advantech>(8);

Advantech thread;
for(int i = 0; i < 8; i++) {
    thread = new Advantech();
    thread.start();
    threads.add(thread);
}

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 2011-02-21
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    相关资源
    最近更新 更多