Java中的单线程查询

时间:2014-08-22 03:27:06

标签: java concurrency

在我的Java main方法中,需要为任务生成单个线程。 该线程执行任务并休眠30秒。反复。

就我而言,使用Java执行器框架线程池可能是一种开销。 因此想到产生一个单一的线程。有什么意见吗?

3 个答案:

答案 0 :(得分:2)

您可以使用Java 5中引入的ScheduledExecutorService,它适合您的目的并使用ThreadPool。

public static void main(String[] args) {
    ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
    ex.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + ":" + Calendar.getInstance().getTime());
        }
    }, 0, 30, TimeUnit.SECONDS);

}

输出:

pool-1-thread-1:Fri Aug 22 09:56:50 IST 2014
pool-1-thread-1:Fri Aug 22 09:57:20 IST 2014
pool-1-thread-1:Fri Aug 22 09:57:50 IST 2014
pool-1-thread-1:Fri Aug 22 09:58:20 IST 2014

此外,ScheduledExecutorService优先于Timer [StackOverFlow Discussion On Timer Vs ScheduledExecutorService]

答案 1 :(得分:0)

如果你想每30秒执行一次任务,那么我觉得Timer是最好的选择。 Timer将使用单个线程执行任务,您可以定期安排任务。

Timer timer = new Timer();
timer.schedule(task, 30 * 1000);

我希望这会对你有所帮助。

答案 2 :(得分:0)

ScheduledExecutorService可以创建一个单线程执行程序,可以调度命令在给定的延迟后运行,或者定期执行,这应该对你有用,而且开销很小。

 ScheduledExecutorService executor= Executors.newSingleThreadScheduledExecutor;

 //do your work evry 30 seconds,and you could define the delayed time to start
 executor.scheduleAtFixedRate(new CustomeTask(), YOUR_DELAY_TIME, 30, TimeUnit.SECONDS);

private static class CustomeTaskimplements Runnable {
    @Override
    public void run() {
       //Do any work you want
    }
}

如果您不想使用Executors。你可以做一些像Thread.sleep(30000);在Run()方法的while(true)循环中实现该目标。