2013-01-24 79 views
0

我需要製作一個Thread,它啓動它在程序運行時工作並在程序關閉時關閉。這Thread將檢查每1分鐘的東西。JAVA:調度線程工作的最佳方式是什麼?

這個調度的最佳方式是什麼,使用Thread.sleep()或使用Timer或什麼?

+6

'Executors.newScheduledThreadPool',可能。 –

+0

以及如何使用它,我怎麼能告訴每1分鐘執行一次'Runnable'例如? – Soheil

+2

看看Javadoc。 'ScheduledExecutorService'有一個[方法](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,%20long,%20long ,%20java.util.concurrent.TimeUnit)),可以讓你做到這一點。 –

回答

3

你沒有提供任何代碼,但有大約爲這種事情例子負荷,這裏有一個:

import static java.util.concurrent.TimeUnit.*; 
class BeeperControl { 
private final ScheduledExecutorService scheduler = 
     Executors.newScheduledThreadPool(1); 

    public void beepForAnHour() { 
     final Runnable beeper = new Runnable() { 
       public void run() { System.out.println("beep"); } 
      }; 
     final ScheduledFuture<?> beeperHandle = 
      scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS); 
     scheduler.schedule(new Runnable() { 
       public void run() { beeperHandle.cancel(true); } 
      }, 60 * 60, SECONDS); 
    } 
} 

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable

2

所以,你將有類似

public class Application { 
    private final ScheduledExecutorService executor; 
    private final Runnable task; 

    public Application(ScheduledExecutorService executor, Runnable task) { 
     this.executor = executor; 
     this.task = task; 
    } 

    public void init() { 
     executor.scheduleAtFixedRate(task, 0, 60, TimeUnit.SECONDS); 
    } 
    public void shutdown() { 
     executor.shutdownNow(); 
    } 
} 

,你會創建一些應用程序像

// .... 
Application app = new Application(Executors.newSingleThreadScheduledExecutor(), task); 
app.init(); 
// .... 
// at end 
app.shutdown(); 
0

要使該開始它的工作在當時是一個線程的程序運行並在程序關閉時死掉,將該線程標記爲守護線程:

Thread myThread=new Thread(); 
myThread.setDaemon(true); 
myThread.start(); // forget about it, no need to explicitly kill it 
相關問題