1

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

我想exampleFunction()在延迟大约 10 秒后调用 Java 方法。我在网上寻找了解决方案,并遇到了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);
     }

}

那么在 exampleFunction 延迟 10 秒后运行后,我有什么办法可以退出这个线程?或者我可以ScheduledThreadPoolExecutor使用当前线程而不是创建一个新线程吗?

还是有另一种方法可以解决这个问题?我希望能够exampleFunction()在当前线程上运行 10 秒后,而不是创建一个新线程。

编辑:我认为这可能不是线程问题。我仍在试图找出问题所在。感谢大家的建议和建议。

编辑:我可以将参数传递给 exampleFunction(),然后在 public void run() 中使用它吗?

4

3 回答 3

1

我相信您的问题可能是您在提交作业后没有关闭执行程序。

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

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

于 2013-04-09T18:49:59.947 回答
1

基于所有的评论和困惑,任何答案都只是猜测。

我认为你想要什么:

  • 要调用的 UI 线程exampleFunction
  • 'exampleFunction' 将任务安排在 10 秒后立即返回
  • 在 10 秒的时间内,run在 UI 线程上调用该方法

在 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:虽然通常不建议,但这里一个简单的 Thread 比创建一个新的 Thread 池更简单。

于 2013-04-11T18:13:36.060 回答
0

Thread.sleep如果只是希望使当前线程阻塞,则可以使用。如果您确实使用池执行器,请确保将其用作执行器 - 而不是每个(新)线程一个。要从线程“退出”,只需让执行用完run. 如果使用 Swing,请使用 EDT。

于 2013-04-09T18:49:46.443 回答