2013-10-21 15 views
5

Javaスレッドが初めてです。私がやろうとしているのは、ThreadBオブジェクトが現在実行中のスレッドThreadAのインスタンスにアクセスし、setSomethingというメソッドを呼び出すことです。 1)私は、私はそれが本当に 2)私はその方法ここJavaの別の実行スレッドからメソッドにアクセスする方法

にアクセスするときに、私は何か間違ったことしなければならない、nullポインタ例外を持っているよりも硬い作っていますだと思うが、私がこれまで持っていると私は私の原因をやっていることです勤勉と同様の質問StackOverflowでここを見た。

私はバックグラウンドで実行されている現在のスレッドを持っている:

// assume this thread is called by some other application 
public class ThreadA implements Runnable{ 

    private Thread aThread; 

    public ThreadA(){ 
    aThread = new Thread(this); 
    aThread.setName("AThread"); 
    aThread.start(); 
    } 


    @Override 
    public void run(){ 
    while(true){ 
     // doing something 
    } 
    } 

    public void setSomething(String status){ 
    // process something 
    } 

}

// assume this thread is started by another application 
public class ThreadB implements Runnable{ 

@Override 
public void run(){ 
    passAValue("New"); 
} 

public void passAValue(String status){ 
    // What I am trying to do is to get the instance of ThreadA and call 
    // its method setSomething but I am probably making it harder on myself 
    // not fully understanding threads 

    Method[] methods = null; 
    // get all current running threads and find the thread i want 
    Set<Thread> threadSet = Thread.getAllStackTraces().keySet(); 
    for(Thread t : threadSet){ 
    if(t.getName().equals("AThread")){ 
     methods = t.getClass().getMethods(); 
    } 

    } 

    //**How do I access ThreadA's method, setSomething** 

} 

}

事前に

アレン

+4

は本当にあなたが直接アクセスできるように、ThreadB' '' _into_ ThreadA'オブジェクトを渡す方法はありません。クラスから反射ハッキングを行うのは最適ではありません。 – Gray

+3

そして、「別のアプリケーションで起動しました」と言ったときに、別のJVMを意味するのではないでしょうか?別のJVMにある場合は、RMIやその他のプロセス間通信を使用する必要があります。またはファイルや何かを共有する。 – Gray

+0

グレイの2番目のコメントは、受け入れられる回答でなければなりません! –

答えて

4

なぜあなたは物事を複雑にするのですか?これはあなたの思うほど難しくありません(暗い城でドラゴンを殺してください!)

大丈夫だよ、threadAの参照をthreadBに渡すだけです!ただこれ。スレッドbからメソッドを呼び出すと、スレッドbによって実行されるので、クラスはホストされていません。

class ThreadA implements Runnable{ 
public void run(){ 
//do something 
} 
public void setSomething(){} 
} 

class ThreadB implements Runnable{ 
private ThreadA aref; 
public ThreadB(ThreadA ref){aref=ref;} 
public void run(){ 
    aref.setSomething();//calling the setSomething() with this thread!! no thread a 
} 
} 

class Foo{ 
public static void main(String...arg){ 
    ThreadA a=new ThreadA(); 
    new Thread(a).start(); 
    ThreadB b=new ThreadB(b); 
    new Thread(b).start(); 
} 
} 

hereシンプルthreadtutorial

+1

私はこの答えにある程度の時間があることを知っていますが、main()でThreadBをインスタンス化するときに、bを使わないasパラメータを与える必要があったと言います。ちょうど指摘する.. –

1

をありがとうThreadBオブジェクトをインスタンス化するとき、またはThreadBオブジェクトをインスタンス化した後、ThreadAオブジェクトインスタンスへの参照を与えます。以下のような何か:

ThreadA a = new ThreadA(); 
ThreadB b = new ThreadB(a); 

その後、ThreadBのコード内で、あなたはちょうどあなたがThreadBでインスタンス変数に保存されている疑いを持っている参照を使って、スレッドAのメソッドを呼び出すことができます。

+1

"//このスレッドは別のアプリケーションによって開始されると仮定してください " –

関連する問題