1

私はスレッドを使用するのが初めてで、スレッドが終了したかどうかを確認し、スレッドから情報を収集する方法を見つけようとしています。ただし、thread.getState() を含むいずれかのスレッドのメソッドを呼び出そうとすると、常にヌル ポインター例外が発生します。私がスレッドをどのように使用しているかに関して、スレッドが Java でどのように機能するかについての洞察をお願いします。

public class MatrixThread extends Thread{

private int num;
private String ref;
private boolean finished;
JsonObject json = new JsonObject();

public MatrixThread(int number){
    super("Matrix Thread");
    System.out.println("Running Thread: " +number);
    num = number;
    json = object;
    finished = false;
    start();
}

public void run(){
    System.out.println("Thread #" + num + "Has begun running");
    boolean again = true;

    while(again){
            //Does something
            if(wasSuccessful()) {
                ref = operation
                System.out.println("Success");
                finished = true;
            } else System.out.println("Did not work try again");
        } catch (IOException e) {
            System.out.println("Error, Try again");
        }
    }
}

public boolean isFinished(){
    return finished;
}

public String getRef(){
    return ref;
}

public int getNum(){
    return num;
}
}

そして、プログラムを実行すると、次のようになります

public static void main(String[] args) {
    MatrixThread[] threads = new MatrixThread[10];

    String[] refs = new String[100];
    int count = 0;
    for(MatrixThread thread : threads){
        thread = new MatrixThread(count);
        count++;
    }

    while(count < 100){
        for(MatrixThread thread : threads){
            if(thread.getState() == Thread.State.TERMINATED){
                refs[thread.getNum()] = thread.getRef();
                thread = new MatrixThread(count);
                count++;
            }
        }
    }

}

NULL ポインタ例外のため、メイン プロセスの実行は「thread.getState()」で停止します。理由はありますか?

4

2 に答える 2

2

スレッド配列のインデックスを null 以外の値に割り当てていません。それらを作成しますが、配列内のインデックスに割り当てないため、それらのインデックスは null です。

コードの修正は次のとおりです。

for(int i=0;i<threads.length;i++){
    MatrixThread thread = new MatrixThread(count);
    threads[i] = thread;
    count++;
}

スレッドを拡張することはお勧めしません。runnable を実装し、代わりに runnable をスレッドに渡してみてください。理由を詳しく説明できますが、すでに行われています。

Thread.isAliveおそらくあなたが探しているものです。私は次のようなことをお勧めします...

runnable.setActive(false);
//this will block invoking thread for 1 second, or until the threadRunningRunnable terminates
threadRunningRunnable.join(1000);
//for the paranoid programmer...
if(threadRunningRunnable.isAlive()){
    //something very bad happened.
}
于 2013-07-09T19:49:18.747 に答える
0

thread.getState() は、配列のインデックスに格納されているものの状態を探していますが、値が割り当てられていないため、状態がありません。したがって、getState が配列を調べると、返す状態が見つかりません。

于 2013-07-09T19:54:42.833 に答える