Несколько потоков в Java
Одна программа редко ограничивается одним фоновым потоком. Часто создают несколько worker, каждый со своей задачей, а главный поток координирует старт и сбор результатов.
Объекты Thread хранят в массиве или списке,
запускают циклом, затем вторым циклом вызывают
join для каждого. Так проще не забыть дождаться
всех участников.
Три потока с разными именами и общим шаблоном работы:
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread[] workers = new Thread[3];
for (int i = 0; i < workers.length; i++) {
int num = i + 1;
workers[i] = new Thread(() -> {
System.out.println("worker " + num);
}, "w-" + num);
}
for (Thread t : workers) {
t.start();
}
for (Thread t : workers) {
t.join();
}
System.out.println("all finished");
}
}
Переменная num копируется в финальную для
лямбды, иначе цикл подставит последнее значение
i во все задачи. Порядок строк worker 1,
worker 2, worker 3 в консоли может
отличаться от порядка старта, но all finished
появится только после всех join.
Подсчёт суммы в главном потоке после ожидания (каждый worker пишет в общий массив по индексу):
public class Main {
public static void main(String[] args) throws InterruptedException {
int[] slots = new int[3];
Thread[] workers = new Thread[3];
for (int i = 0; i < 3; i++) {
int index = i;
workers[i] = new Thread(() -> {
slots[index] = (index + 1) * 10;
});
}
for (Thread t : workers) {
t.start();
}
for (Thread t : workers) {
t.join();
}
int sum = 0;
for (int value : slots) {
sum += value;
}
System.out.println(sum);
}
}
Здесь каждый поток пишет в свой элемент массива, поэтому конфликта нет. Запись в один общий счётчик без синхронизации дала бы гонку, её разберут в других разделах.
Создайте 4 потока, каждый выводит своё число
от 1 до 4. Запустите все, затем
join для каждого и выведите "batch ok".