如何在Java中立即终止线程

如何在Java中立即终止线程,java,multithreading,quartz-scheduler,Java,Multithreading,Quartz Scheduler,我有一个主线程,它是Rest端点。 我在该端点生成一个新的Runnable并传递给Executor服务。 我通过调用join()方法使主线程等待我的Runnable。 然后在Runnable的run()方法中,我使用Quartz调度器运行Quartz作业。 现在,此Quartz作业在单独的线程中运行 但是,我的问题是,即使在作业已完成执行并被调度程序删除之后, 主线程仍在等待Runnable,并且在作业完成执行约40到50秒后,主执行开始 我想在作业完成执行后立即终止可运行线程。 我怎样才能做到

我有一个主线程,它是Rest端点。 我在该端点生成一个新的Runnable并传递给Executor服务。 我通过调用join()方法使主线程等待我的Runnable。 然后在Runnable的run()方法中,我使用Quartz调度器运行Quartz作业。 现在,此Quartz作业在单独的线程中运行

但是,我的问题是,即使在作业已完成执行并被调度程序删除之后, 主线程仍在等待Runnable,并且在作业完成执行约40到50秒后,主执行开始

我想在作业完成执行后立即终止可运行线程。 我怎样才能做到这一点


同样,在调度作业之后,Runnable的run()方法的最后一行也会立即执行。

通过使主线程在while循环中等待布尔标志为true来解决此问题。 然后在JobListener中完成作业执行时将标志设为false。 在侦听器的jobWasExecuted()方法中,标志被设置为false

还尝试在JobListener中使用interrupt()和stop()

但我猜Quartz线程锁定了执行作业的可运行线程。 也许这就是为什么即使在作业执行完成后,也会有40到50秒的延迟

此外,我在作业对象中使用@Transient变量。
而且每个作业都有自己的线程,因此不需要volatile。

我们可以看一些代码吗?可能更容易理解请注意,这样的标志必须是易变的,并且您还应该使用
interrupt()
通知线程检查它。还要注意,这不会立即发生,线程可能会不尊重请求。所以我不确定这是否符合您在问题中提出的要求。@Zabuzard-谢谢您的建议。我已经更新了答案。请检查。
volatile
,如果您从其他线程设置变量,则需要。因此,如果从实际作业运行所在的线程以外的线程调用此
stop()
方法。否则,作业可能不会观察到更改,并且仍然认为标志没有因为内部线程缓存而更改。很难验证您是否没有共享任何代码。“让主线程在while循环中等待布尔标志为true”好吧,这是轮询时浪费的一个核心:(