NutzCN Logo
问答 有关于线程的疑问?兽兽哥,请回答?
发布于 3165天前 作者 qq_6427b776 1745 次浏览 复制 上一个帖子 下一个帖子
标签:

兽兽哥,你好:
这是我的单例线程池,然后executeTask方法是传入一个线程job,里面的工作是:登录sftp的shell,取得session,然后触发我的nmap命令,但是我现在发现,线程启动了,取得了sftp的session后,遇到jetty stop正常关闭之后,sftp的session无法销掉,导致session创建之后,无法随着jetty的关闭而关闭。这样的一个问题,我觉得很致命的。举个例子,例如我运行了shell的3个进程,处于运行中状态,然后这个时候我jetty服务器关闭了,按正常道理应该会瞬间销掉线程里面的操作,包括sftp取得session。现在就是无法销掉,所以请兽兽哥观察,是不是我的单例线程池出问题了?
请兽兽哥,详细指导一下。
谢谢!
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import cn.com.venustech.modules.asset.service.thread.AssetScanJob;

/**
* AssetScanExecutor : 单例扫描任务线程池
*
* @author XXXXXXXXXXXXXXXX
*
*/
public class AssetScanExecutor {

/**
 * 线程池
 */
private ExecutorService executor;

/**
 * 任务调度器
 */
private static AssetScanExecutor _this;

private AssetScanExecutor() {
}

public static AssetScanExecutor getInstance() {
    if (_this == null) {
       _this = new AssetScanExecutor();
       _this.executor = Executors.newFixedThreadPool(5);
    }
    return _this;
}

public void executeTask(AssetScanJob assetScanJob) {
    executor.execute(assetScanJob);
}

public void done() {
    executor.shutdown();
}

}

5 回复

先把思路搞清楚

  1. 线程池的shutdown有无被调用
  2. 线程池shutdown能否触发sftp回话的关闭

@wendal(wendal)
1、我验证过,经过合法关闭,mainsetup类的destory方法,是可以运行的,换句话说,线程池的shutdown有被调用到,同时我也打印了日志去验证这个说法。
2、线程池的shutdown,原来我用非单例,每一次请求接口,我都会new一个线程池,然后马上关闭,这样的效果可以触发sftp会话的关闭。后面改成单例之后,发现这种现象不存在了。当然,我每次都new一个线程池,这样是很明见愚昧的做法。

@qq_6427b776 shutdown语句之后调用awaitTermxxx,等待线程池完全关闭

@wendal(wendal) 具体是怎么调用的?这个我不懂

executor.awaitXXXXXXX

添加回复
请先登陆
回到顶部