簡體   English   中英

java - 如何從另一個正在運行的線程訪問一個方法

[英]How to access a method from another running thread in java

我是 Java 線程的新手。 我想要做的是從 ThreadB 對象獲得對當前正在運行的線程 ThreadA 的實例的訪問權限,並調用其名為 setSomething 的方法。 1)我認為我做得比實際更難 2)我有一個空指針異常,所以在訪問該方法時我一定是做錯了什么

這是我到目前為止所做的,我已經完成了盡職調查,並在 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**

}

}

提前謝謝你

艾倫

哇,你為什么把事情搞得這么復雜?! 這並不像你想象的那么難(在黑暗城堡中殺死一條龍!)

好的,您需要做的就是將 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 setSomething() with this thread! (not thread a)
    }
}

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

        ThreadB b = new ThreadB(a);
        new Thread(b).start();
    }
}

這里有一個簡單的線程教程

在實例化 ThreadB 對象時或之后,為其提供對 ThreadA 對象實例的引用。 類似的東西:

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

然后,在 ThreadB 代碼中,您可以使用毫無疑問存儲在 ThreadB 中的實例變量中的引用來調用 ThreadA 的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM