我有一个关于在一定延迟后调用方法的问题。
我想在延迟大约10秒后调用Java方法exampleFunction()
。我在网上寻找解决方案并遇到了ScheduledThreadPoolExecutor()
。所以我已经使用了它,但问题是,一旦函数在10秒后运行,它就不会退出线程。有什么方法可以退出线程吗?或者我可以在当前线程上运行ScheduledThreadPoolExecutor()
而不是创建新线程吗?
class Test {
...
exampleFunction();
...
public void exampleFunction() {
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.schedule(new Runnable() {
public void run() {
...do something here...
}
}, 10, TimeUnit.SECONDS);
}
}
所以有什么办法可以在延迟10秒后运行exampleFunction后退出这个线程吗?或者我可以让ScheduledThreadPoolExecutor
使用当前线程而不是创建新线程吗?
还是有另外一种方法可以解决这个问题吗?我希望能够在当前线程上10秒后运行exampleFunction()
,而不是创建新线程。
编辑:我认为这可能不是一个线程问题。我还在试图找出问题所在。感谢大家的建议和建议。
编辑:我可以将参数传递给exampleFunction()然后在public void run()中使用吗?
答案 0 :(得分:1)
我相信您的问题可能是您在提交作业后不是shutting down the executor。
exec.schedule(...);
exec.shutdown();
已提交的作业将继续运行,但您必须在将最后一份作业提交给服务后关闭该服务。
答案 1 :(得分:1)
根据所有评论和混淆,任何答案都只是猜测。
我认为你想要的是什么:
exampleFunction
run
方法在Swing中,这是通过使用SwingUtilities.invokeLater完成的。
ExampleFunction看起来像这样:
public void exampleFunction() {
new Thread() {
public void run() {
TimeUnit.SECONDS.sleep(10); //Will need a try/catch
SwingUtilities.invokeLater(new Runnable() {
public void run() {
...do something here...
}
});
}
}.start();
}
注意: SwingUtilities.invokeAndWait
也可以使用
注2:虽然通常不建议,但这里的简单线程比创建新的线程池更简单。
答案 2 :(得分:0)
Thread.sleep
。如果您确实使用池化执行程序,请确保将其用作池化执行程序 - 而不是每个(新)线程一个。要从线程“退出”,只需让执行用完run
。如果使用Swing,请使用EDT。