2013-10-21 14 views
5

Tôi mới làm quen với các chủ đề Java. Những gì tôi đang cố gắng làm là từ đối tượng ThreadB được truy cập vào thể hiện của một luồng đang chạy, ThreadA và gọi phương thức của nó được gọi là setSomething. 1) Tôi nghĩ rằng tôi đang làm khó hơn nó thực sự là 2) Tôi có một ngoại lệ con trỏ null vì vậy tôi phải làm điều gì đó sai khi truy cập phương pháp đóCách truy cập một phương thức từ một chuỗi đang chạy khác trong java

Đây là những gì tôi có cho đến nay và tôi đã làm siêng năng và nhìn ở đây trên StackOverflow cho một câu hỏi tương tự.

Tôi có một đề tài hiện đang chạy trong nền:

// 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** 

} 

}

Cảm ơn bạn trước

Allen

+4

Có thực sự không có cách nào để bạn có thể vượt qua 'ThreadA' đối tượng _into_' ThreadB' vì vậy bạn có thể truy cập trực tiếp. Làm một số phản ánh hack từ lớp là _not_ tối ưu. – Gray

+3

Và khi bạn nói "bắt đầu bởi một ứng dụng khác", bạn không có nghĩa là trong một JVM khác nhau, phải không? Nếu nó nằm trong một JVM khác thì bạn sẽ phải sử dụng RMI hoặc một số giao tiếp giữa các quá trình khác. Hoặc chia sẻ một tập tin hoặc một cái gì đó. – Gray

+0

Nhận xét thứ hai của Gray phải là câu trả lời được chấp nhận! –

Trả lời

4

Wow tại sao bạn làm mọi thứ phức tạp đến vậy ?! đây không phải là khó như bạn nghĩ (giết chết một con rồng trong một lâu đài tối!)

okay tất cả những gì bạn cần làm là chuyển các tham chiếu threadA tới threadB! Chỉ cái này. và hãy để tôi nói rằng khi bạn gọi một phương thức từ chuỗi b, do đó nó chạy theo chủ đề b, không phải lớp đã được lưu trữ.

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 một đơn giản threadtutorial

+1

Tôi biết nó đã được một thời gian qua câu trả lời này, Nhưng tôi phải nói rằng, khi bạn instantiated ThreadB trong main(), bạn cần phải cung cấp cho một tham số như không b. Chỉ cần chỉ ra .. –

1

Khi hoặc sau khi bạn khởi tạo đối tượng ThreadB của bạn, hãy cho nó một tham chiếu đến cá thể đối tượng ThreadA của bạn. Một cái gì đó như:

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

Sau đó, trong mã ThreadB, bạn có thể gọi phương thức ThreadA bằng cách sử dụng tham chiếu bạn không nghi ngờ được lưu trữ trong một biến mẫu trong ThreadB.

+1

"// giả sử chủ đề này được bắt đầu bởi một ứng dụng khác "!!! –

Các vấn đề liên quan