2013-03-23 46 views
1

我一直在環顧SO一段時間檢查Pools,Executors和Futures的一些實現,但它們都不符合我的目的......或者至少我無法實現它正常。Java/Groovy線程退出動作

我有一個類的lib下,所有類似:

class X implements Runnable { 
    @Override 
    public void run() { 
    // do sth 
    } 
} 

,我無法修改它們。

而我的等級:

class Controller { 
    private int threadState; 

    void threadStart() { 
    // run a thread (made from any of the classes above) 
    // and when it exits change the threadState value to V 
    } 
} 

所有我需要的是運行的ThreadStart一個線程(),在退出後,將做一些動作,但的ThreadStart()函數應該立即通過。

在Java或/和Groovy中你有什麼好的想法來解決這個問題嗎?謝謝。

回答

1

一種可能(但有些醜陋的)的方式來完成,這將是包裝你的任務圍繞另一個可運行的,在執行之前。該包裝將負責完成後委託給實際的任務,並調用回調方法:

void changeThreadState() { 
    // This is your call back, in controller 
} 

void threadStart() { 
    final X task = new X(); // task creation (variable has to be final) 

    final Thread t = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      task.run(); 
      changeThreadState(); 
     } 
    }); 

    t.start(); 
} 

你當然會,加上異常處理以及所有這類的好東西。

請注意,與直接在您的threadStart方法中創建線程相反,您也可以使用Executor或任何其他類型的線程池構造。

+0

謝謝,這就是我最近會實施的。不幸的是,線程並不是免費的,所以我仍然在尋找更多的聽衆,比如想法:) – makciook 2013-03-23 10:55:57

+1

@makciook - 通過這個解決方案,您不會創建額外的線程,但是您已經創建了已經創建的任務來運行任務。 – Perception 2013-03-23 10:57:22

+0

好吧,那應該是訣竅! – makciook 2013-03-23 11:15:17

0

您可以在referenece添加到啓動類的可運行和 調用父類中的改變狀態的方法,當run方法完成

+0

我不能修改類X – makciook 2013-03-23 10:37:39

+0

你不能擴展它嗎? – enTropy 2013-03-23 10:48:45

+0

也沒有。這是一個完整的解決方案,我只需要運行大量的課程並知道它們何時完成。 – makciook 2013-03-23 10:50:09

0

您可以受益於Groovy as操作員將閉包強制轉換爲Runnable對象。此外,枚舉很酷的狀態:

class X implements Runnable { 
    void run() { 
     sleep 1000 
     println "async task done" 
    } 
} 

enum State { NOT_STARTED, DONE } 

class Controller { 
     State state = State.NOT_STARTED 
     Thread t 
     void threadStart() { 
      t = Thread.start { new X().run(); changeState() } as Runnable 
     } 

     void changeState() { state = State.DONE } 
} 

controller = new Controller() 
controller.threadStart() 

assert controller.state == State.NOT_STARTED 
controller.t.join() 
assert controller.state == State.DONE 
+0

看起來不錯,但是例如在grails控制器中,它不會改變我的狀態以用於定義的對象: def newTask = new Task(state:0) Thread.start {x.run(); newTask.state = 2; newTask.save(); } as Runnable – makciook 2013-03-23 12:54:21

+0

也許和grails有關。它顯示任何錯誤? – Will 2013-03-23 14:51:15

+0

事實上,它從來沒有從代碼中進入changeState()。激發x.run()並消失... – makciook 2013-03-23 18:48:00