1

可能重複:
Start/Suspend/Resume/Suspend … a method invoked by other class開始/暫停/恢復的方法在Java中

我想實現的任何時候K-NN分類,但我無法找到一個方法來調用「將方法分類(...)「一段特定時間,暫停它,在方法被暫停之前獲得可用結果,恢復方法一段特定時間,暫停它,在方法被暫停之前獲得可用結果,等等......

提前致謝!

+0

也不能I.除非classify()調用週期性地調用回來存儲結果或在某個合適的檢查點,否則您將無法執行暫停它(例如通過讓它檢查一個'暫停'標誌,如果設置,則發出'暫停'事件的信號,然後等待'恢復'事件)。 – 2012-07-21 14:58:11

+0

@馬丁詹姆斯 - 我不完全同意你的看法。你當然可以暫停一個線程,甚至完全停止它,而不需要像ckeck-points或flags那樣的東西。如果這是個好主意還是另一個問題,但它可能是一個合適的想法。我的意思是,一個調試器正在做類似的事情,它會停下來讓你看到所有的變量。如何,我同意你的說法,調用存儲並在每次迭代後顯示它將是一個好方法。 – 2012-07-21 15:29:30

+0

@ThomasUhrig - 當然你是對的。我有點跳過了'問題'懸掛/中止線程,而它可能會對系統資源進行顯式鎖定或隱式鎖定。除了調試器和完整的進程終止之外,OP應該在調用之外進行一些循環訪問 - 某些外循環可能在數據處理不完整的地方,但是「sorta-valid」狀態。 – 2012-07-21 17:01:47

回答

0

我最近在這裏發佈了一個PauseableThread

您可以使用ReadWriteLock實現暫停。如果您每次遇到暫停機會時立即抓住寫鎖,那麼您只需要暫停就可以抓取一個讀鎖來暫停您。

// The lock. 
    private final ReadWriteLock pause = new ReentrantReadWriteLock(); 

    // Block if pause has been called without a matching resume. 
    private void blockIfPaused() throws InterruptedException { 
    try { 
     // Grab a write lock. Will block if a read lock has been taken. 
     pause.writeLock().lockInterruptibly(); 
    } finally { 
     // Release the lock immediately to avoid blocking when pause is called. 
     pause.writeLock().unlock(); 
    } 
    } 

    // Pause the work. NB: MUST be balanced by a resume. 
    public void pause() { 
    // We can wait for a lock here. 
    pause.readLock().lock(); 
    } 

    // Resume the work. NB: MUST be balanced by a pause. 
    public void resume() { 
    // Release the lock. 
    pause.readLock().unlock(); 
    }