如何在延迟后运行方法?

时间:2013-04-09 18:46:18

标签: java multithreading threadpool

我有一个关于在一定延迟后调用方法的问题。

我想在延迟大约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()中使用吗?

3 个答案:

答案 0 :(得分:1)

我相信您的问题可能是您在提交作业后不是shutting down the executor

exec.schedule(...);
exec.shutdown();

已提交的作业将继续运行,但您必须在将最后一份作业提交给服务后关闭该服务。

答案 1 :(得分:1)

根据所有评论和混淆,任何答案都只是猜测。

我认为你想要的是什么:

  • 要调用exampleFunction
  • 的UI线程
  • 'exampleFunction`计划任务10秒钟后立即返回
  • 在10秒内完成,在UI线程上调用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。