0

我有 Java 应用程序,允许用户在 5 到 500 之间选择多个设备。一旦选择,用户单击开始,程序会创建一个代表每个设备的线程。

ExecutorService pool = Executors.newFixedThreadPool(jSlider1.getValue());
Upload[] threads = new Upload[jSlider1.getValue()];

for (int i=0; i < jSlider1.getValue(); i++)
{            
    ThreadListComboBox.addItem("Number "+i);                                                    
    threads[i] = new Upload("Squeak"+i, this.OutputDisplay);            
}

for (int c=0; c < threads.length; c++)
{
    pool.submit(threads[c]);
}

这很好用,因为我可以通过这种方式在运行时启动大量线程,我遇到的问题是管理它们。用户选项之一是允许(通过组合框中的 GUI)杀死特定的设备/线程。

是否可以使用池来选择单个线程并杀死它?如果不是,实现这一目标的最佳方法是什么?

非常感谢。

4

2 回答 2

2

是否可以使用池来选择单个线程并杀死它?

您放入的东西threads不是“线程”。它们是RunnableCallable实例。所以当你说你想杀死一个线程时,你实际上的意思是你想取消一个提交的任务。

如果要取消任务,则需要保留该方法返回的Future对象,submit(task)然后cancel(boolean)对其进行调用。如果您调用cancel(true)当前正在运行的线程(如果有),任务将被中断。但是,只有当您的任务旨在正确响应中断时,这才会起作用。

你不能杀死运行任务的线程:

  • 做这种事情的方法已被弃用。(它们不安全
  • 无论如何,您都无法获得相关的 Thread 对象。

我认为 ExecutorService 是用于管理任务而不是管理线程。在我正在编写的程序中,我想单独管理每个线程。

啊……我明白了。所以实际上你所描述的根本不是线程。(你真的应该更加小心你的术语。这些术语意味着特定的东西。如果你使用错误的术语,人们无法理解你!)

在这种情况下,是的,您需要一个线程数组,或者更可能是一些自定义“设备”类的数组,该类具有设备线程的实例字段。然后,您安排 GUI 调用Thread.interrupt()相关“设备”的线程对象。

这取决于您的可运行/可调用实例在其运行/调用方法中尊重中断标志等。

于 2013-07-13T07:06:04.703 回答
1

天真的方法可能是将类重组为如下所示

...
...       
private volatile boolean running;

public void stop() {
    running = false;
}

@Override
public void run() {
    while (running) {
        //do some amount of work
    }
}

或者你可以在未来包装你的主力(你的设备线程)。

List<Future<Output>> taskList = new ArrayList<Future<Output>>();
for (int i = 0; i < maxThreads; ++i) {
    taskList.add(executor.submit(upLoadObject));
}


// Instead of iterating through the above list and adding tasks individually
// you can also invoke add all the Future<Output> in a list and then invoke it
// together using
// executor.invokeAll(listOfCallables);


//User says shoot the nth task
Future<Output> toCancelTask = taskList.get(n);

//Cancel the task and interrupt it while doing so.
toCancelTask.cancel(true);

//You can also show progress by iterating through the taskList
for (Future<Output> task : taskList) {
    if (task.isDone()) {
       //some jingles. ..
    }
}

如果您想从该线程返回任何结果,您的Upload类可能会实现。Callable

于 2013-07-13T07:17:04.443 回答