2013-12-13 46 views
1

我正在開發多線程項目。我試圖啓動一個線程,我從某個類調用一些方法。這個方法可能需要很長時間(一些「while」循環,我沒有控制),所以我會強制退出該循環來結束線程。但我會使用線程類的方法(而不是java.lang.Thread,但他的兒子)來做到這一點。我知道如何在C/C++(通過引用傳遞SomeClass.SomeMethod的參數),但在Java中我不能(我認爲)。修改參數的值

public class A extends Thread { 

    boolean isThreadClosing = false; 

    @Override 
    void run () { 
     // if it was C/C++ i can pass the arguments by reference 
     SomeClass.SomeMethod (isThreadClosing); 
    } 

    void stopThread () { 
     isThreadClosing = true; 
    } 
} 

public class SomeClass { 

    void SomeMethod (boolean isThreadClosing) { 
     while (!isThreadClosing) { 
      // do... 
     } 
    } 
} 

所以,問題是我怎麼能具體化的方法SomeClass.SomeMethod(...)的參數值,從線程的類?

這裏有一個解決方案,但我不喜歡,因爲我不得不把線程的類傳遞給methood。

public class A extends Thread { 

    boolean isThreadClosing = false; 

    @Override 
    void run () { 
     // if it was C/C++ i can pass the arguments by reference 
     SomeClass.SomeMethod (this); 
    } 

    void stopThread () { 
     isThreadClosing = true; 
    } 

    boolean isClosing () { 
     return isThreadClosing; 
    } 
} 

public class SomeClass { 

    void SomeMethod (A thread) { 
     while (!thread.isClosing ()) { 
      // do... 
     } 
    } 
} 
+0

檢查性病標誌'interrupted'代替'isClosing' – Val

+0

除非我記錯了,你試圖達到的目標不會工作,因爲你所在的「循環」不會因爲「isThreadClosing」的值被改變而停止,所以一旦「循環」中的工作是「isThreadClosing」開始。那將是你得到你評論的地方// do ..通過這一點,所做的工作不會停止,因爲'isThreadClosing'發生了變化,它會在'while'中完成整個代碼。 –

回答

0

我會做一個簡單的AtomicBoolean作爲while語句的條件。

給出一個線程類:

public class ThreadA extends Thread { 

    private AtomicBoolean stop = new AtomicBoolean(false); 

    public void run(){ 
     someClass.someMethod(stop);    
    } 

    public void stopProcessing(){ 
     stop.set(true); 
    } 

} 


public class SomeClass { 

    public void someMethod(AtomicBoolean stop){ 
     while(!stop.get()){ 
      ... 
     } 
    } 
} 

這將意味着在下列方式線程交互:

ThreadA thread = new ThreadA(); 
thread.start(); 
... 
thread.stopProcessing(); 
0

你爲什麼不保持A作爲SomeClass私有成員,然後將其設置當實例的SomeClass一個實例?這樣你就不必將它傳遞給SomeMethod

public class SomeClass { 

    private A thread; 

    public SomeClass(A thread) { 
     this.thread = thread; 
    } 

    public void someMethod() { 
     while(!thread.isInterrupted()) { //why not use this instead of 
             //maintaining your own flag? 
      ... 
     } 
    } 
} 

但請記住這樣的設計是種脆弱的,因爲管理線程的生命週期中調用的代碼和SomeClass之間現在分成。如果A只打算被SomeClass使用,那麼最好在 SomeClass內實例化它,並且不要將其暴露給外界。

0

我會用可觀察的模式:http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html

一個可以實現可觀測的同時SomeClass的將實施觀測,並且對收到的布爾同步自己的布爾狀態。你仍然需要A.addObserver(SomeClass),但這是一個非常低的耦合。

它可能有點過分設計(?),但它至少很容易擴展。它可以爲您提供比while(布爾)方式更多的靈活性,以便您可以中斷計算。