2011-10-18 22 views
117

Tôi cần lên lịch một tác vụ để chạy trong khoảng thời gian cố định. Làm thế nào tôi có thể làm điều này với sự hỗ trợ của khoảng thời gian dài (ví dụ trên mỗi 8 giờ)?Cách lên lịch một tác vụ định kỳ trong Java?

Tôi hiện đang sử dụng java.util.Timer.scheduleAtFixedRate. Có java.util.Timer.scheduleAtFixedRate hỗ trợ khoảng thời gian dài không?

Trả lời

165

Sử dụng một ScheduledExecutorService:

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS); 
38

Bạn nên có một cái nhìn để Quartz đó là một khuôn khổ java Mà làm việc với EE và SE phiên bản và cho phép để xác định công việc để thực hiện một thời gian cụ thể

8

Nếu bạn muốn gắn bó với java.util.Timer, bạn có thể sử dụng nó để lên lịch vào khoảng thời gian lớn. Bạn chỉ cần vượt qua trong thời gian bạn đang chụp cho. Kiểm tra tài liệu here.

20

Hãy thử cách này ->

Đầu tiên tạo một TimeTask lớp chạy nhiệm vụ của bạn, nó trông giống như:

public class CustomTask extends TimerTask { 

    public CustomTask(){ 

    //Constructor 

    } 

    public void run() { 
    try { 

     // Your task process 

      } catch (Exception ex) { 

     System.out.println("error running thread " + ex.getMessage()); 
    } 
} 

sau đó trong lớp học chính bạn khởi tạo tác vụ và chạy theo định kỳ bắt đầu theo ngày được chỉ định:

public void runTask(){ 

     Calendar calendar = Calendar.getInstance(); 
     calendar.set(
      Calendar.DAY_OF_WEEK, 
      Calendar.MONDAY 
     ); 
     calendar.set(Calendar.HOUR_OF_DAY, 15); 
     calendar.set(Calendar.MINUTE, 40); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 



     Timer time = new Timer(); // Instantiate Timer Object 

     // Start running the task on Monday at 15:40:00, period is set to 8 hours 
     // if you want to run the task immediately, set the 2nd parameter to 0 
     time.schedule(new CustomTask(), calendar.getTime(), TimeUnit.HOURS.toMillis(8)); 
} 
+5

Để làm cho mã dễ đọc hơn, bạn có thể thay đổi đối số cuối cùng trong lịch biểu cuộc gọi đến TimeUnit.HOURS.toMillis (8) – darrenmc

8

Sử dụng Google Ổi AbstractScheduledService như đưa ra dưới đây:

public class ScheduledExecutor extends AbstractScheduledService 
{ 
    @Override 
    protected void runOneIteration() throws Exception 
    { 
     System.out.println("Executing...."); 
    } 

    @Override 
    protected Scheduler scheduler() 
    { 
     return Scheduler.newFixedRateSchedule(0, 3, TimeUnit.SECONDS); 
    } 

    @Override 
    protected void startUp() 
    { 
     System.out.println("StartUp Activity...."); 
    } 


    @Override 
    protected void shutDown() 
    { 
     System.out.println("Shutdown Activity..."); 
    } 

    public static void main(String[] args) throws InterruptedException 
    { 
     ScheduledExecutor se = new ScheduledExecutor(); 
     se.startAsync(); 
     Thread.sleep(15000); 
     se.stopAsync(); 
    } 

}

Nếu bạn có nhiều dịch vụ như thế này, sau đó đăng ký tất cả các dịch vụ trong ServiceManager sẽ được tốt như tất cả các dịch vụ có thể được bắt đầu và dừng lại với nhau . Đọc here để biết thêm về ServiceManager.

+0

Ổi hiện đã có trên GitHub. Đây là liên kết đến tài liệu [ServiceManager] (https://github.com/google/guava/wiki/ServiceExplained) mới. – Renato

4

Nếu ứng dụng của bạn đã được sử dụng framework Spring, bạn đã Scheduling xây dựng trong

1

tôi sử dụng tính năng của Spring Framework. (ngữ cảnh mùa xuân phụ thuộc vào jar hoặc maven).

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.scheduling.annotation.Scheduled; 
import org.springframework.stereotype.Component; 


@Component 
public class ScheduledTaskRunner { 

    @Autowired 
    @Qualifier("TempFilesCleanerExecution") 
    private ScheduledTask tempDataCleanerExecution; 

    @Scheduled(fixedDelay = TempFilesCleanerExecution.INTERVAL_TO_RUN_TMP_CLEAN_MS /* 1000 */) 
    public void performCleanTempData() { 
     tempDataCleanerExecution.execute(); 
    } 

} 

ScheduledTask là giao diện của riêng tôi với phương pháp tùy chỉnh của tôi thực hiện, mà tôi gọi là nhiệm vụ theo lịch trình của tôi.

Các vấn đề liên quan