簡體   English   中英

如何解決“線程無法解析為變量”錯誤?

[英]How do I fix the 'threads cannot be resolved to a variable' error?

public class UnsynchronizedCounterTest{






/**
 * A class representing a counter with a method for incrementing the coutner. No synchronization is used
 * so this counter is not thread safe
 * @author
 *
 */
static class Counter{
    int count;
    void inc() {
        count = count+1;
    }
    int getCount() {
        return count;
    }
}
static Counter counter; // The counter that will be incremented. Since it is a global static variable, it is used by all threads of type HWUExercise12_1Thread. It is shared resource
static int numberOfIncrements; 

static class IncrementerThread extends Thread{
    public void run() {
        for (int i=0; i < numberOfIncrements; i++) {
            counter.inc();
        }   
    }
}

/**
 * The main program runs in a loop until the user want to exit. Each time through the loop, it runs one experiemtn.
 * It gets the number of threads and the number of increments per thread from the user. It creates and starts the 
 * threads, and then waits for all to finsih. It prints the fibna lvalue of the counter, as well as the expected value. 
 * The program ends when the user enters a number less than or equal to zero as the number of threads.
 * @param Args
 */


public static void main(String Args[]){
    Counter counter = new Counter();

    Scanner reader = new Scanner(System.in);

    while(true) {

    System.out.print("Enter the number of threads");
    int numberOfThreads = Integer.parseInt(reader.nextLine());





    if (numberOfThreads < 0) {
        break;

    }do {
        System.out.print("Enter the number of increments per thread");
        int numberOfIncrements = reader.nextInt();

    //create thread array
    IncrementerThread [] threads = new IncrementerThread[numberOfThreads];

    //Create a thread for each position in array
    for (int i=0; i< threads.length; i++) {
        threads[i] = new IncrementerThread();
    }
    }while (numberOfIncrements <= 0);



    //start the threads
    for (int i=0; i < numberOfThreads; i++) {
        threads[i].start();
    }
    try {   
    for(int j=0; j< numberOfThreads; j++) {
        threads[j].join();
    }
    System.out.println("The finanl value of the counter is" + counter.getCount());
    }catch(InterruptedException e) {
        e.printStackTrace();
    }
    }


}
}

對於該程序,我創建了一個線程類(不是線程安全的),該類調用嵌套類中的inc()方法指定的次數。 我的程序應該創建幾個線程並將其全部啟動,然后等待所有線程終止。 我還必須打印計數器的最終值。 我的錯誤是日食說我創建的線程數組,線程無法解析為變量。 這給了我一個錯誤

threads[i].start();

threads[j].join();

我是Java的初學者,但不確定如何解決此問題。 我的問題是為什么當我明確擁有線程對象數組時為什么不能將線程解析為變量? 謝謝。

這是一個工作代碼:

public class UnsynchronizedCounterTest{

static Counter counter;

public static void main(String Args[]){
    new UnsynchronizedCounterTest().startCounting();
}

public void startCounting() {
    counter = new Counter();

    Scanner reader = new Scanner(System.in);

    while(true) {

        System.out.print("Enter the number of threads: ");
        int numberOfThreads = reader.nextInt();

        if (numberOfThreads <= 0) {
            break;
        }

        IncrementerThread [] threads;

        do {
            System.out.print("Enter the number of increments per thread");
            numberOfIncrements = reader.nextInt();

        //create thread array
            threads = new IncrementerThread[numberOfThreads];

            //Create a thread for each position in array
            for (int i=0; i< threads.length; i++) {
                threads[i] = new IncrementerThread();
            }
        }while (numberOfIncrements <= 0);



        //start the threads
        for (int i=0; i < numberOfThreads; i++) {
            threads[i].start();
        }
        try {   
            for(int j=0; j< numberOfThreads; j++) {
                threads[j].join();
            }
            System.out.println("The finanl value of the counter is: " + counter.getCount());
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class IncrementerThread extends Thread{
    @Override
    public void run() {
        for (int i=0; i < numberOfIncrements; i++) {
            counter.inc();
        }   
    }
}

class Counter{
    int count = 0;
    void inc() {
        count = count+1;
    }

    int getCount() {
        return count;
    }
}

}

暫無
暫無

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

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