Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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
Can';java中的t停止执行器服务_Java_Multithreading_Thread Safety_Threadpool_Runnable - Fatal编程技术网

Can';java中的t停止执行器服务

Can';java中的t停止执行器服务,java,multithreading,thread-safety,threadpool,runnable,Java,Multithreading,Thread Safety,Threadpool,Runnable,我的服务有问题。我在GUI中有一个按钮,它调用包含ExecutorService的Runnable类。我尝试了所有方法来停止ExecutorService(或主线程),但没有找到结束它的方法。这是我的密码。请张贴您的答案和建议。致以最良好的祝愿 public void actionPerformed(ActionEvent e) { final FindGateWaysAndIps scanner = new FindGateWaysAndIps(); if (e.getActi

我的服务有问题。我在GUI中有一个按钮,它调用包含ExecutorService的Runnable类。我尝试了所有方法来停止ExecutorService(或主线程),但没有找到结束它的方法。这是我的密码。请张贴您的答案和建议。致以最良好的祝愿

public void actionPerformed(ActionEvent e) {
    final FindGateWaysAndIps scanner = new FindGateWaysAndIps();
    if (e.getActionCommand()=="Start Scan"){
        scanner.start();
    }
    if (e.getActionCommand()=="Stop Scan"){
                scanner.interrupt();
                scanner.stopScans();
    }
}
“FindGateWaysAndIps”类

String ip=“192.168。”;
字符串sql=“”;
静态可变布尔停止=false;
PingResult AllResults=新的PingResult();
int[]AllGateWays=newint[256];
final int NUM_THREADS=Runtime.getRuntime().availableProcessors();
ExecutorService exec=Executors.newFixedThreadPool(NUM_THREADS*5);
公开募捐{
停止=真;
while(停止){

对于(;GateWayKey我猜您的
PingTask
正在进行URL连接,connect()调用是不可中断的调用

提供了一种通过中断线程立即关闭的方法,但由于这些线程不能被中断,因此它没有提供额外的好处


只有当线程定义了其中断策略并且执行了可中断操作时,它才提供好处。

为了有效地停止线程,ExecutorService初始化的池中的每个线程都必须在该线程被中断时定义一个处理

这就是为什么守护进程以以下方式启动:

while(true){
}
不适合,并且是无法关闭线程池程序的原因之一

例如:

while(!Thread.currentThread.isInterrupted){
}
//do here what to do in order to exit and clean safely your job and used resources like open filed.
但即使这样,你也会怀疑它有什么可能不起作用

避免吞下中断异常!:

catch(InterruptedException e){
//do nothing
}
事实上,当捕获异常时,中断标志将被清除!因此不要忘记通过重新终止线程将其设置为true:

catch(InterruptedException e){
    Thread.currentThread.interrupt();
}
有关更详细的说明,请打开此链接:
您的问题可能是
address.isReachable(…)
不可中断。中断线程,如前面提到的@Mik378,会设置线程上的中断位,并导致某些方法(
thread.sleep()
Object.wait()
,以及其他方法)抛出
InterruptedException
InetAddress.isReachable(…)
将不会被中断

如果您试图让打印线程立即完成,以便应用程序可以退出,则可以使它们成为守护进程线程。请参阅此处:


我没有使用套接字。我使用ping函数。程序在ping某些IP时不杀死线程没关系。我只想停止这样做(停止执行器服务)。问题是我尝试了,但我不知道如何做…如果线程被阻止,它无法杀死线程,所以您的程序将永远不会退出。
address.isReachable()
是否为不可中断操作HMMM程序完成ExecutorService后我可以停止运行方法吗?假设ThreadPool为10,ExecutorService执行一些ping操作,然后用户单击“停止扫描”。我可以做一些在第一次或第二次ExecutorService完成后将退出run方法的操作吗?在第一次运行后,您可以这样做。很好。您能给我写一个示例代码吗?顺便说一句,谢谢您的帮助
catch(InterruptedException e){
//do nothing
}
catch(InterruptedException e){
    Thread.currentThread.interrupt();
}