【问题标题】:Accessing an object from another thread从另一个线程访问对象
【发布时间】:2014-07-13 22:50:50
【问题描述】:

我有 2 个类(1 个是基本类,第二个是扩展 Thread 类),我正在尝试使用 setText() 访问在 run() 上的线程类中初始化的对象(类)

public class TThread extends Thread{

        Patcher pf;

        public TThread(String string) {
            setName(string);
            start();
        }

        @Override
        public void run() {
            pf = new Patcher("Checking Serial key..."); //<=== Class initialized here in a separate thread
        }

        public void setText(String string) {
            pf.setText(string); //<=== Trying to access patcher here, throws NullPointerException
        }
}

我就是这样称呼TThread

public void myCall(){
   TThread tpf = new TThread("pf thread");
   //some code later
   try{
       tpf.setText("blabla");
   }

当我试图从另一个线程访问修补程序时,pf.setText() 会抛出 NullPointerException

我怎样才能进入那个线程并从另一个类或这个类访问补丁程序?

【问题讨论】:

  • run 方法中只有构造函数是相当不寻常的,你确定要调用setText() 调用yourTThreadObject.start()吗?
  • @kajacx 我确定我不会在start() 之前调用setText()。我在一个类中初始化我的线程类,然后在 10 行之后我调用setText()

标签: java multithreading


【解决方案1】:

这是经典的比赛条件。因为你有两个线程,所以不能保证先发生什么。 pf 可能在后台线程初始化之前被主线程访问。

现在,您的程序是不可预测的。尝试在setText 方法的开头添加Thread.sleep(100);。它看起来可以正常工作,但在某些特定情况下仍可能会失败。

修复它的一种方法是在主线程中等待,直到 pf 被初始化:

@Override
public synchronized void run() {
    pf = new Patcher("Checking Serial key...");
    notifyAll();
}

public synchronized void setText(String string) throws InterruptedException {
    while(pf==null) {
        wait();
    }
    pf.setText(string);
}

小心。如果您以前没有使用过线程,那么要正确处理可能会很棘手。

【讨论】:

    【解决方案2】:

    启动一个新线程是一个耗时的过程。稍有延迟,您的代码就会成功执行:

    TThread 线程 = new TThread("str");

    Thread.sleep(1000);

    thread.setText("str2");

    所以问题是您的线程没有时间执行 run 方法(并创建实例)。您应该检查实例的存在,并在 setText 方法中等待它的创建 - 或在 TThread 的构造函数中实例化它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多