从另一个线程访问对象

时间:2014-05-24 18:47:35

标签: java multithreading

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

setText()

这就是我致电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()

如何从另一个班级或此班级访问该线程并访问修补程序?

2 个答案:

答案 0 :(得分:4)

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

目前,您的计划无法预测。尝试在Thread.sleep(100);方法的开头添加setText。它似乎工作正常,但在某些特定情况下可能仍会失败。

修复它的一种方法是在主线程中等待,直到初始化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);
}

小心点。如果您以前没有使用过线程,那么做对可能会很棘手。

答案 1 :(得分:1)

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

TThread thread = new TThread(&#34; str&#34;);

<强>了Thread.sleep(1000);

thread.setText(&#34; STR2&#34);

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