我有一个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)杀死特定的设备/线程。

是否可以使用该池选择单个线程并杀死它?
如果不是,最好的方法是什么?

非常感谢。

最佳答案

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


您要放入threads的内容不是“线程”。它们是RunnableCallable实例。因此,当您说要杀死线程时,实际上是要取消已提交的任务。

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

您无法杀死运行任务的线程:


不建议使用做这种事情的方法。 (它们不安全)
无论如何,您都无法获得相关的Thread对象。





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


啊...我明白了。因此,实际上您所描述的根本不是线程池。 (您确实应该更加谨慎地使用术语。这些术语表示特定的含义。如果使用错误的术语,那么人们将无法理解您!)

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

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

关于java - Java线程池和运行时创建,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17627782/

10-12 02:39