2012-05-13 171 views
3

我有一些麻煩暫停和恢復方法。 (在Eclipse中使用Java)。暫停和恢復方法

基本上我寫的程序有點像編譯器。我給它一個字符串,它解釋這個字符串,將它轉換成n個命令,條件和類似循環的東西(取決於強),並執行這些命令。像這樣:

(while 
    (energy-at-least 1000) 
    (seq 
    (move) 
    (turn clockwise) 
) 
) 

目前我有停止在第N命令的方法,但我不能確定如何在這之後繼續,因爲重用此方法,並告訴它在第N + 1命令mmakes啓動它忘記了程序在循環中。

對不起,解釋不好,但基本上我需要能夠在第N個命令停止此方法,並讓它從它所遵循的過程中恢復。 Java有這些方法(resume()和stop()),但他們已被棄用,我見過。任何人有一個好主意?

+0

它會被另一個線程恢復,或者你的想法是什麼? –

+0

請操作,解釋**你如何想象恢復方法**。條件是什麼?什麼代碼會觸發這種情況? 99%的可能性是你需要從另一個線程恢復它。如果是這樣的話,如果你不想混淆像Object.wait和Object.notify這樣的低層次的東西,你需要'java.util.concurrent'中的東西。 –

+0

這有點難以解釋,特別是因爲這些方法對我來說是全新的。基本上,我想調用一個方法,讓它在某個點停下來(我可以這樣做),然後當再次調用該方法時,該方法必須在該點之後恢復,記住它停止時的狀態。它必須能夠停下來,當我恢復行動像停止和恢復之間發生的事情一樣。對不起,如果它仍然不清楚 – Sven

回答

0

從我的理解你的意思是你需要對線程中的循環進行更細粒度的控制,然後像'notify','resume'等方法提供。你可以做這樣的事情是這樣的:

類的線程看起來是這樣的:

public WhateverLoop implements Runnable { 
    private volatile boolean run = true; 

    public void run() { 
     while(run) { 
      doWhatever(); 
     }   
    } 

    public setRun(boolean run) { 
     this.run = run; 
    } 
} 

的「揮發」的部分是非常重要的。它使其他線程能夠影響「運行」變量(基本上它可以防止線程將其複製到自己的內存中)。否則,從其他線程到變量的更改將不會在線程中可見。

的控制類可以這樣做:

WhateverLoop whateverLoop = new WhateverLoop(); 
Thread WhateverLoopThread = new Thread(whateverLoop); 
whateverLoopThread.start(); 
// Do stuff which consumes time. 
... 
// Stop the loop 
whateverLoop.setRun(false); 

在這個例子中我使用了一個布爾值,但很明顯,你可以把它作爲複雜,因爲你想要的(或沒有)。

+0

'whateverLoop.setRun(true);'恢復執行嗎? – Stallman

+0

@Stallman沒有循環將不會恢復,因爲它會在條件變爲false時跳出while循環。如果你想能夠重新啓動,你絕對不能破壞循環,並使用像Thread.sleep這樣的東西來暫停線程(而不是僅僅打破循環)。 –

+0

是的,'whateverLoop.setRun(false)'會導致線程停止。 – Stallman

0

一個簡單的方法是使用wait()和notify()方法。當然,它將取決於你要運行多少個並行線程,因爲notify()方法不能保證你實際上會喚醒哪個線程。

0

執行此操作的一種方法是以這樣一種方式表示執行狀態,即需要恢復的子集可以存儲在可從「上下文」對象訪問的堆對象中。

要暫停執行,您需要解釋器將所有相關狀態記錄到上下文對象中,然後將其返回。要恢復,你需要調用在前面使用的上下文中傳遞的解釋器。如果您interpretter做程序樹來執行它的遞歸步行

這樣可不行......


另一種方式做,這是由具有interpretter執行來實現「暫停」回調CLI(或者在程序暫停時處理內容)。 CLI從回調方法返回「恢復」執行。

0

您是否考慮過從BlockingQueue控制它?

從它的N個指令隊列開始執行。它將從隊列中提取每條指令並對其進行處理。一旦達到第N條指令,它將停止/阻止。要從停止的地方再次啓動,請將更多指令推入隊列。