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