Java 用定时器启动SwingWorker?

Java 用定时器启动SwingWorker?,java,concurrency,timer,while-loop,swingworker,Java,Concurrency,Timer,While Loop,Swingworker,我需要执行的任务包括从外部服务器请求一些数据,对数据执行一些(相当长的)处理,然后用处理结果更新GUI。因为服务器可能没有响应,所以该任务非常适合SwingWorker:使用doInBackground()方法获取结果,然后使用done方法更新GUI 我需要每隔几秒钟发生一次。我知道我可以使用while循环和Thread.sleep,并在每次睡眠后创建一个新的SwingWorker。但我读过的所有东西都不赞成使用循环和睡眠。我想使用计时器,但: 使用摆动计时器似乎适得其反;因为它们是在EDT上

我需要执行的任务包括从外部服务器请求一些数据,对数据执行一些(相当长的)处理,然后用处理结果更新GUI。因为服务器可能没有响应,所以该任务非常适合SwingWorker:使用
doInBackground()
方法获取结果,然后使用done方法更新GUI

我需要每隔几秒钟发生一次。我知道我可以使用while循环和Thread.sleep,并在每次睡眠后创建一个新的SwingWorker。但我读过的所有东西都不赞成使用循环和睡眠。我想使用计时器,但:

  • 使用摆动计时器似乎适得其反;因为它们是在EDT上运行的,所以我基本上没有理由使用SwingWorker的doInBackground方法。如果服务器没有响应,GUI将没有响应

  • 使用java.util.Timer似乎有点浪费:它似乎为TimerTask()创建了一个后台线程,而且由于我只是创建了一个SwingWorker来完成实际工作,所以我本质上创建了一个后台线程来创建另一个后台线程

谁能告诉我最好的解决办法是什么?我想继续使用SwingWorker,因为它似乎非常适合这个任务,但是如果我能帮助的话,我想避免使用while循环

谢谢

您可以使用:


我不明白为什么你不能用秋千定时器来启动秋千工人。您尝试了什么?

您正在检索的数据集有多大?如果它相当小,我将完全分离获取/处理和显示的任务

  • 使用某种内存缓存来保存最近处理的数据集
  • 使用
    javax.swing.Timer
    使用缓存数据更新GUI
  • 使用
    java.util.Timer
    从数据库中获取数据,对其进行处理并更新缓存
  • 请注意缓存上两次之间的同步问题。您不希望您的swing计时器在另一个计时器更新数据的同时抓取数据

  • 我认为你和SwingWorker的关系是对的。现在您需要了解它的发布和处理方法。在处理过程中,从后台线程发布()对象,然后在Swing(EDT)线程上调用process()方法,以便更新gui

    这样就没有一堆计时器和其他线程需要协调

    javadocs有一个简单的素数示例:

    是的,这是可能的,因为Executor可以启动SwingWorker,并且使用“多线程”,注意1)带着大量的活动SwingWorker线程-超出了Executor的杀伤力限制,2)Executor+SwingWorker是前25个bug中需要运行的;这不意味着它正在开始一个新的线程吗?创建SwingWorker(然后休眠、循环等)的线程是主线程:一旦GUI被创建,它就不需要做任何其他事情了……ScheduledExecutorService实际上拥有一个线程池。在这种情况下,只有一个。此线程将由提交到此服务的所有可运行程序/工件使用@Shwiftslide问题是什么?;-)@mKorbel:错误列表上的问题是关于JDK7的,它还没有发布。@Hovercraft Full Eels,我也是,:-)当然,通过使用java.util.Timer+Executor+SwingWorker应该不会有很多乐趣,+1:-)我的问题和Hovercraft Full Eels一样,为什么使用java.swing.Timer似乎适得其反,这是关于您在何时何地调用java.swing.Timer myTimer#setDelay(int单位为毫秒)的时间;
    scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 
    
    // get a scheduled executor service with one thread
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    // schedule the worker at an intervall of 5 seconds
    scheduler.scheduleAtFixedRate(myWorker, 0, 5, TimeUnit.SECONDS);