簡體   English   中英

從另一個線程訪問對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM