Как исправить ошибку «потоки не могут быть преобразованы в переменную»? - PullRequest
0 голосов
/ 27 апреля 2018
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, и я не уверен, как решить эту проблему. Мой вопрос заключается в том, почему нельзя сказать, что потоки не могут быть преобразованы в переменную, когда у меня явно есть массив объектов потока? Спасибо.

1 Ответ

0 голосов
/ 27 апреля 2018

Это рабочий код:

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;
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...