2013-10-21 8 views
5

Java Threads를 처음 사용합니다. 내가 뭘 하려는지 ThreadB 개체에서 현재 실행중인 스레드 ThreadA 인스턴스에 액세스하고 setSomething라는 메서드를 호출하는 것입니다. 1) 실제보다 더 열심히 만들고 있다고 생각합니다. 2) null 포인터 예외가있어 해당 메서드에 액세스 할 때 잘못된 작업을 수행해야합니다.Java의 다른 실행중인 스레드에서 메소드에 액세스하는 방법

여기까지 내가 지금까지 가지고 있으며 내 기준을 이행했습니다. 근면 및 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

그레이의 두 번째 댓글이 받아 들여진 답변이어야합니다! –

답변

4

왜 당신은 많은 것을 복잡하게 만드나요?! 이것은 당신이 생각하는 것만 큼 어렵지 않습니다. (어둠의 성에서 드래곤을 죽임!)

괜찮 았으면 좋겠어. threadA를 threadB에 전달하는 것만으로 충분합니다! 딱 이것. 스레드 b에서 메소드를 호출 할 때 클래스 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가 아닌 a 매개 변수를 줄 필요가 있다고 말해야한다. 그냥 지적 해. –

1

알렌 감사 :

나는 백그라운드에서 실행중인 현재 스레드가 ThreadB 객체를 인스턴스화 할 때 또는 그 후에 ThreadA 객체 인스턴스에 대한 참조를 제공하십시오. 같은 뭔가 :

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

다음, ThreadB 코드 내에서, 당신은 당신이 ThreadB의 인스턴스 변수에 저장 의심의 여지가 참조를 사용하여 ThreadA의 메소드를 호출 할 수 있습니다.

+1

"// 이 스레드가 다른 응용 프로그램에서 시작했다고 가정합니다. " –

관련 문제