java线程无限循环_java – 如何阻止线程继续执行无限循环

我有一个方法在执行Groovy脚本后返回HTTP响应.我创建了一个应该执行Groovy脚本的匿名线程.但是,作为预防措施,我希望线程在3秒后停止,以防止坏脚本(即:无限循环)继续运行.

public Response runScript(String script) {

GroovyShell shell = new GroovyShell();

Thread thread = new Thread() {

public void run() {

Script validatedScript = shell.parse(script);

validatedScript.run();

}

};

thread.start();

thread.join(3000);

return Response.ok("It ran!", MediaType.TEXT_PLAIN).build();

}

此代码适用于没有无限循环的脚本.但是,如果存在无限循环,则响应“它跑了!”被传递给客户端,但线程仍然存在.如何在join()之后终止此线程?

最佳答案 如果脚本不受信任并且您不能依赖它来表现良好,那么您就不能使用中断,这需要线程的合作被取消(通过使用Thread.currentThread()显式检查标志.isInterrupted或者通过输入一个睡眠,等待或加入的调用(即使这样,代码也可能以无用的方式压制InterruptedException)).

你只能通过调用Thread#stop来终止它:

thread.join(3000);

if (thread.isAlive()) {

thread.stop();

}

不推荐使用stop方法,因为它可以使终止线程的活动处于错误状态; ThreadDeath可以在任何地方抛出,因此没有好办法确保停止的线程在退出之前有机会进行清理.但是,由于此类情况,还没有从API中删除stop方法,并且此方法似乎不太可能很快被删除.

这里的弃用并不意味着“这个方法将在以后的版本中删除”作为“危险,除非你知道你在做什么,否则不要使用它”.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值