2016-02-13 32 views
1

我已經實現了一個Singleton類「SingleTaskExecutor」,它使用SingleThreadExecutor一次執行一個任務。該類用於按時間順序執行異步數據庫操作。一切工作正常。但是現在我們有一個用例,我們需要暫停該服務一段時間,執行一些操作,然後恢復服務。不知道如何暫停/恢復服務。這裏是我的代碼:如何在Java中暫停/重新啓動SingleThreadExecutor(ExecutorService)?

public class SingleTaskExecutor { 

    private SingleTaskExecutor() {} 
    private final ExecutorService executor = Executors.newSingleThreadExecutor(); 

    private static class LazyHolder { 
     private static final SingleTaskExecutor instance = new SingleTaskExecutor(); 
    } 

    public static SingleTaskExecutor getInstance() { 
     return LazyHolder.instance; 
    } 

    public <T> Task<T> create(Callable<T> callable) { 
     Task<T> task = new Task<T>() { 
      @Override 
      protected T call() throws Exception { 
       return callable.call(); 
      } 
     }; 
     return task; 
    } 

    public <T> T execute(Task<T> task) { 
     return (T) executor.submit(task); 
    } 

    public void shutDown() { 
     executor.shutdown(); 
    } 

    public void awaitTermination() { 
     try { 
      executor.awaitTermination(5, TimeUnit.SECONDS); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void waitPlease() { 
     try { 
      Thread.currentThread().wait(); 
      //executor.wait(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void resume() { 
     Thread.currentThread().notifyAll(); 
     //executor.notifyAll(); 
    } 
} 
+0

您無法掛起已經啓動的單個任務。您沒有展示如何提交任務並排隊,但您應該讓該代碼在暫停時停止提交任務。 –

+1

或者讓你的任務檢查布爾標誌並在需要時等待。 – assylias

+0

任務任務= SingleTaskExecutor.getInstance()創建。(() - > { \t \t \t createOrUpdate(posOrder); \t \t \t返回NULL; \t \t}); \t \t \t \t SingleTaskExecutor.getInstance()。execute(task); \t \t task.get(); –

回答

0

如果我理解正確的話,你要暫停任務的執行,然後執行一些明確的任務,然後恢復它。我實際上看到以下解決方案:

private volatile boolean paused; 

public <T> T execute(Task<T> task) { 
    if(paused) { 
     synchronized(this) { 
      if(paused) { 
       wait(); 
      } 
     } 
    } 
    return (T) executor.submit(task); 
} 

public synchronized void waitPlease() { 
    paused = true; 
} 

public synchronized void resume() { 
    paused = false; 
    notify(); 
} 
+0

謝謝llya。你的解決方案看起來不錯我正在嘗試這個。會讓你知道。 –

+0

謝謝llya!它按照我的需要工作。 –

相關問題