gpt4 book ai didi

java - 从另一个线程访问对象

转载 作者:行者123 更新时间:2023-12-01 17:10:57 28 4
gpt4 key购买 nike

我有 2 个类(1 个是基本类,第二个扩展了 Thread 类),我正在尝试访问在 run() 上在我的线程类中初始化的对象(类) 使用 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");
}

当我尝试从另一个线程访问 patcher 时,pf.setText() 抛出 NullPointerException

我怎样才能到达该线程并从另一个类或此类访问修补程序?

最佳答案

这是经典的竞争条件。因为你有两个线程,所以不能保证先发生什么。 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);
}

小心点。如果您以前没有使用过线程,那么正确操作可能会很困难。

关于java - 从另一个线程访问对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23848518/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com