我有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()
。
如何从另一个班级或此班级访问该线程并访问修补程序?
答案 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的构造函数中实例化它。