簡體   English   中英

java如何從擴展線程類獲取變量值

[英]java how to get variable value from extends thread class

你能幫我有關Java線程的問題嗎? 我有兩個Java類,我的擴展線程類具有參數,在MyMaster類中如何獲取變量“ runBoolean”?

public class MyMaster {

    public static void main(String[] args) throws InterruptedException {
        Thread[] threads = new Thread[2];   
            for(int i=1; i<=2; i++) {
                threads[i-1] = new MyThread(i);
                threads[i-1].join();    
                //what to do ?
            }
        }
    }

public class MyThread extends Thread{

    int myBil;
    boolean runBoolean;

    public MyThread(int bil) {
        myBil = bil;
        start();
    }

    @Override
    public void run() {
        try {
            System.out.println(myBil);
            runBoolean = true;
        } catch (Exception e) {
            runBoolean = false;
            //what to do ?
        }
    }
}

如果線程數組將被MyThreads填充,那么我們可以這樣定義數組:

MyThread[] threads = new MyThread[2];

然后,在您的代碼中就可以得到這樣的值:

System.out.println(threads[i-1].runBoolean);

我還有更多評論。 首先,您的循環有點奇怪;)我將其更改為:

 for(int i=0; i<2; i++) {
        threads[i] = new MyThread(i);
        threads[i].join();
        System.out.println(threads[i].isRunBoolean()); //Add a getter for that

 }

最好習慣於使用0作為第一個索引。 並通過getter和setter訪問屬性:

public class MyThread extends Thread{
   private int myBil;
   private boolean runBoolean;


    public boolean isRunBoolean() {
      return runBoolean;
    }
    ..... Class body continues here....
}

如果要處理在線程內引發的異常,則它們必須是RuntimeExceptions(否則,它們要求您在線程內捕獲它們)。 在這種情況下,您將需要exceptionHandler和類似的東西:

Thread.UncaughtExceptionHandler exceptionHandler = new Thread.UncaughtExceptionHandler() {
                    public void uncaughtException(Thread th, Throwable e) {
                        System.out.println("Exception: " + e);
                    }
                };

            for(int i=0; i<2; i++) {
                threads[i] = new MyThread(i);
                threads[i].setUncaughtExceptionHandler(exceptionHandler);
                threads[i].join();
                System.out.println(threads[i].isRunBoolean());
                //what to do ?

            }

然后在線程中

 @Override
    public void run() {
        try {
            System.out.println(myBil);
            runBoolean = true;
        } catch (Exception e) {
            runBoolean = false;
            throw new RuntimeException("this is a bad plan!");
        }
    }

但是,這是一個糟糕的設計,您不必這樣做。 如果要等待線程的結果(而不是如上所示訪問其屬性),則應使用Callable並等待答案。

要從類外部訪問屬性,可以將該屬性設置為public屬性(不建議使用),也可以創建一個getter方法。

在您的類MyThread中,添加一個僅返回屬性runBoolean的值的runBoolean 這被稱為吸氣劑,因為它基本上是一種允許獲取屬性值的方法。

public boolean getRunBoolean() {
    return runBoolean;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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