Вылетает исключение в потоках

Только начал изучать потоки и к сожаленью ещ1 не совсем разбираюсь в них. Мне в методе test() нельзя использовать synchronaized. Задание + код прилагаю ниже

Вопрос: почему у меня вылетает исключение?

Задание: Метод test запускает на выполнение n дочерних потоков, каждый из которых в цикле повторяет k раз следующее: * печатает значения счетчиков counter и counter2 через пробел; * увеличивает первый счетчик counter на единицу; * засыпает на t мсек; * увеличивает второй счетчик counter2 на единицу.

import java.util.concurrent.atomic.AtomicInteger;

public class Part3 {
    static AtomicInteger counter = new AtomicInteger(0);
    static AtomicInteger counter2 = new AtomicInteger(0);

    volatile static int k;
    volatile static int t;
    volatile static int n;

    Part3(int n, int k, int t) {
        this.k = k;
        this.t = t;
        this.n = n;
    }

    public void test() {
        System.out.printf("%s %s%n", counter, counter2);
    }

    public static void main(String[] args) {
        Thread[] threads = new Thread[n];
        Part3 part3 = new Part3(2, 3, 100);
        for (int i = 0; i < n; i++) {
            threads[i] = new MyThread(part3);
            threads[i].start();
        }
    }
}

class MyThread extends Thread {
    Part3 part3;
    MyThread(Part3 part3) {
        this.part3 = part3;
    }

    //blah-blah
    @Override
    public void run() {
        for (int i = 0; i < part3.k; i++) {
            part3.test();
            part3.counter.incrementAndGet();
            try {
                Thread.sleep(part3.t);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            part3.counter2.incrementAndGet();
        }
    }
}

Ответы (1 шт):

Автор решения: Drawn Raccoon

Thread[] threads = new Thread[n]; в этот момент n ещё равно 0, что легально, массив просто будет пустой. А тут for (int i = 0; i < n; i++) n уже 2 и в цикле происходит обращение за пределы массива

→ Ссылка