[英]Accessing an object from another thread
我有2個類(1個是基本類,第二個擴展了Thread類),並且我試圖使用setText()
在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");
}
當我嘗試從另一個線程訪問修補程序時, pf.setText()
會引發NullPointerException
。
我如何進入該線程並從另一個類或該類訪問修補程序?
這是經典的比賽條件。 因為您有兩個線程,所以不能保證先發生什么。 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);
}
小心。 如果您以前沒有使用過線程,那么正確可能會很棘手。
啟動新線程是一個耗時的過程。 稍有延遲,您的代碼將成功執行:
TThread線程=新的TThread(“ str”);
了Thread.sleep(1000);
thread.setText( “STR2”);
因此,問題在於您的線程沒有時間執行run方法(並創建實例)。 您應該檢查實例的存在,並在setText方法中等待實例的創建-或在TThread的構造函數中實例化它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.