2012-01-05 30 views
8
new Timer().scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     System.out.println("run"); 
     throw new SomeRandomException(); 
    } 
}, 1000, 1000); 

Output: chạy (ngoại lệ được ném)Java hẹn giờ lớp: nhiệm vụ hẹn giờ dừng lại để thực hiện nếu thuộc một trong các nhiệm vụ ngoại lệ được ném

Đây là vấn đề: Tôi cần một công việc hẹn giờ để kiểm tra cụ thể điều kiện trong cơ sở dữ liệu (hoặc cái gì khác). Nó làm việc tốt, nhưng đôi khi cơ sở dữ liệu (hoặc cái gì đó khác) trả về một số lỗi, ngoại lệ được ném và bộ đếm thời gian bị treo, và sau đó không có tác vụ hẹn giờ đơn nào được thực hiện lại. Có một số cài đặt Bộ hẹn giờ tiếp tục hoạt động sau khi ngoại lệ được ném trong run().

tôi có thể

new Timer().scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     try { 
      System.out.println("run"); 
      throw new SomeRandomException(); 
     } catch (Exception e) { 
      System.out.println("dummy catch"); 
     } 
    } 
}, 1000, 1000); 

nhưng điều này dường như què.

Cách thay thế khác là viết triển khai thực hiện của riêng lớp Timer, nuốt ngoại lệ của phương thức chạy (có vẻ như không đúng).

+0

Bạn cần phải bắt 'Error's cũng hay họ âm thầm giết nhiệm vụ của bạn là tốt. –

Trả lời

7

Sử dụng ScheduledExecutorService. Nó đóng vai trò giống như Timer, nhưng sửa lỗi yếu của nó (giống như cái bạn đang gặp phải).

+0

Thật không may "Nếu bất kỳ việc thực hiện nhiệm vụ nào gặp phải một ngoại lệ, các lệnh xử lý tiếp theo sẽ bị loại bỏ." - từ http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit) – fiction

+1

Có, nhiệm vụ cụ thể này sẽ ngừng chạy, nhưng nó không làm cho sự cố của người thi hành và các nhiệm vụ khác vẫn được lên lịch. Nhưng tôi đồng ý rằng bạn vẫn phải bắt bất kỳ ngoại lệ nào có thể xảy ra và không được gây ra việc lập kế hoạch nhiệm vụ bị hủy bỏ. Bạn có thể muốn tạo một lớp có thể sử dụng lại CatchAllRunnable. –

0

Sử dụng ExecutorService; bạn có thể xử lý cả thời gian biên dịch và chạy ngoại lệ.

Handling exceptions from Java ExecutorService tasks
How is exception handling done in a Callable

ThreadPoolExecutor.java 

final void runWorker(Worker w) { 
    Thread wt = Thread.currentThread(); 
    Runnable task = w.firstTask; 
    w.firstTask = null; 
    w.unlock(); // allow interrupts 
    boolean completedAbruptly = true; 
    try { 
     while (task != null || (task = getTask()) != null) { 
      w.lock(); 
      // If pool is stopping, ensure thread is interrupted; 
      // if not, ensure thread is not interrupted. This 
      // requires a recheck in second case to deal with 
      // shutdownNow race while clearing interrupt 
      if ((runStateAtLeast(ctl.get(), STOP) || 
       (Thread.interrupted() && 
        runStateAtLeast(ctl.get(), STOP))) && 
       !wt.isInterrupted()) 
       wt.interrupt(); 
      try { 
       beforeExecute(wt, task); 
       Throwable thrown = null; 
       try { 
        task.run(); 
       } catch (RuntimeException x) { 
        thrown = x; throw x; 
       } catch (Error x) { 
        thrown = x; throw x; 
       } catch (Throwable x) { 
        thrown = x; throw new Error(x); 
       } finally { 
        afterExecute(task, thrown); 
       } 
      } finally { 
       task = null; 
       w.completedTasks++; 
       w.unlock(); 
      } 
     } 
     completedAbruptly = false; 
    } finally { 
     processWorkerExit(w, completedAbruptly); 
    } 
} 
Các vấn đề liên quan