2012-07-11 44 views
8

Tôi muốn o thực hiện các chuỗi thực hiện vào những thời điểm cụ thể chính xác (ví dụ: 2012-07-11 13:12:24 và 2012-07-11 15:23:45)Làm thế nào để gọi một chuỗi để chạy vào thời gian cụ thể trong java?

Tôi đã kiểm tra ScheduledExecutorService, nhưng chỉ hỗ trợ thực thi sau khoảng thời gian cụ thể từ lần chạy đầu tiên và tôi không có bất kỳ khoảng thời gian cố định nào, thay vào đó tôi có thời gian từ cơ sở dữ liệu để thực hiện các tác vụ trên.

Trong một câu hỏi trước cho một vấn đề khác nhau here, TimerTask là giải pháp, nhưng obviuosly tôi không thể làm cho một sợi TimerTask như RunnableTimerTask cả hai đều có phương pháp run mà cần phải được thực hiện. Câu hỏi ở đây nếu tôi tạo chủ đề mở rộng TimerTask và có một triển khai thực hiện run(), điều đó có hiệu quả không? Nếu không, thì làm sao tôi có thể làm những gì tôi đang cố làm?

+1

Tái cấu trúc giải pháp của bạn để bạn không tạo chuỗi của riêng mình. Thay vào đó, hãy mở rộng 'TimerTask'. –

+0

@MarkoTopolnik sẽ giải quyết xung đột .. nhưng trên thực tế tôi cần các chủ đề vì tôi sẽ có nhiều nhiệm vụ (có bốn loại nhiệm vụ) và tôi muốn mỗi tác vụ duy nhất được thực hiện riêng trong một chuỗi. – Sami

+1

Sau đó, thực hiện một wrapper 'TimerTask' mỏng chứa' Thread' của bạn như là một instance var và sẽ 'start' thread của bạn tại thời gian đã lên lịch. Bạn thậm chí có thể sử dụng một lớp con 'TimerTask' ẩn danh mà thấy' Thread' bằng cách đóng trên một var cục bộ. Và bây giờ tôi thấy đó là chính xác những gì @AkhilDev đang đề xuất bên dưới :) –

Trả lời

11

Sử dụng TimerTask.

Tạo đối tượng TimerTask với biến trường làm chủ đề của bạn. Gọi chủ đề bắt đầu từ công cụ Timer.

public class SampleTask extends TimerTask { 
    Thread myThreadObj; 
    SampleTask (Thread t){ 
    this.myThreadObj=t; 
    } 
    public void run() { 
    myThreadObj.start(); 
    } 
} 

Định cấu hình như thế này.

Timer timer new Timer(); 
Thread myThread= // Your thread 
Calendar date = Calendar.getInstance(); 
date.set(
    Calendar.DAY_OF_WEEK, 
    Calendar.SUNDAY 
); 
date.set(Calendar.HOUR, 0); 
date.set(Calendar.MINUTE, 0); 
date.set(Calendar.SECOND, 0); 
date.set(Calendar.MILLISECOND, 0); 
// Schedule to run every Sunday in midnight 
timer.schedule(
    new SampleTask (myThread), 
    date.getTime(), 
    1000 * 60 * 60 * 24 * 7 
); 
+0

Tôi đang cố gắng thực hiện điều này, nhưng điều gì sẽ xảy ra nếu tôi lên lịch cùng một tác vụ cùng một lúc hai lần? ví dụ, bây giờ tôi đã kiểm tra các nhiệm vụ và tìm thấy t1. sau một phút t1 vẫn còn do .. vì vậy nó đã lên kế hoạch với thời gian của nó .. Nó sẽ được thực hiện hai lần? – Sami

+1

kịch bản đó thực sự có thể là kết quả của cách tôi lấy nhiệm vụ từ cơ sở dữ liệu .. Tôi có một chuỗi chạy mỗi phút bằng cách sử dụng executerService, chủ đề đó tìm kiếm bất kỳ tác vụ nào sẽ đến hạn trong một phút tiếp theo và tìm nạp chúng. Nếu nhiệm vụ là do chỉ một giây sau khi kiểm tra đó, nó sẽ được xem xét cho việc thực hiện tiếp theo của chuỗi tìm nạp .. nhưng vì nó sẽ đến hạn trong một giây sau khi tìm nạp chuỗi thời gian, nó có thể được thực thi hoặc thậm chí lên lịch trễ. .cách này có thể được cải thiện như thế nào? – Sami

+0

tạo 2 phiên bản của tác vụ, được định cấu hình với thời gian khác nhau và lên lịch cho cả hai phiên bản. –

4

Tôi nghĩ bạn nên sử dụng một số thư viện như Quartz Scheduler. Điều này về cơ bản là việc thực hiện cron cho Java.

1

Bạn đã xem CountDownLatch từ gói java.util.concurrent chưa? Nó cung cấp đếm ngược rồi kích hoạt (các) luồng để chạy. Tôi không bao giờ cần phải sử dụng nó bản thân mình, nhưng đã nhìn thấy nó trong sử dụng một vài lần.

+0

Sẽ đơn giản hơn khi gọi 'Thread.start' vào thời gian yêu cầu. –

+0

nếu anh ta có nhiều hơn một 'Chủ đề' mà anh ta cần khởi động cùng một lúc thì sao? – posdef

+0

Vòng lặp 'for' có thể trợ giúp ở đó. (BTW không downvoting bạn). –

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