2015-11-24 99 views
1

我有兩個線程;讓我們稱他們爲主線程和子線程。java線程之間的切換控制

的子線程運行的是儀表調用yield回調我提供,每一個特定的條件被擊中時用戶提交的代碼。

的子線程具有啓動它,並提供了一種方法handOff,這是從主線程稱爲包裝對象。 handOff應暫停主線程的執行並取消暫停子線程的執行。當從子線程調用yield回調時,子線程應該暫停,並且主線程應該取消暫停。

包裝對象也具有killChild方法。在調用killChild後調用下一次handOff,子線程應該停止執行。

因此,控制流程看起來是這樣的:

Main: startChild-->handOff........-->handOff........-->killChild-->handOff--> 
Child:      -->yield..........-->yield............... 

其中-->代表任意代碼運行和...表示暫停的線程。

它本質上是一個單線程程序,我只需要能夠迫使用戶提交的算法是折返。是的,這相當可怕。

什麼是一個很好的實現方法?

+2

你可以使用'的Object.wait()'和'Object.notify()',但我不能告訴你到底怎麼了,不看你的源。另外如果你不打算併發,那麼爲什麼要使用線程開始?線程中有開銷(創建,上下文切換等)。 – MeetTitan

+0

我需要能夠暫停用戶代碼 - 即用戶提交的類文件,我在運行時使用反射加載並調用 - 在執行過程中,然後稍後恢復。 Java沒有任何類似於內置的協程的東西,所以我用線程來攻擊它。我也在努力改變需求,以便用戶代碼必須是可重入的,但同時我正在處理這個問題。 –

回答

1

實現這個最簡單的方式就是不首先使用線程。你仍然可以用不同的方法和類來分離代碼。

假設您需要使用線程出於某種原因,那麼可以使用簡單的Object lock = new Object()以及waitnotifyAll來完成此操作。

線程輪流等待鎖對象,然後當他們想要屈服/切換他們notifyAll然後wait。殺死只是在對象中設置的標誌,當您從wait返回時檢查標誌並退出(如果已設置)。