помогите разобраться с многопоточкой
Ковыряю многопоточку, пробую заполнить лист числами параллельно, а потом вывести в консоль.
И насколько я понимаю, jvm запускает поток в зависимости от фазы луны, а метод join останавливает другие потоки, пока метод не доработает.
И вызывая join у двух потоков у нас получается последовательное выполнение а не параллельное.??
как заполнить параллельно лист и вывести его в конце в консоль?
public class Solution {
static List<Integer> list1 = new ArrayList<>();
static List<Integer> list2 = new ArrayList<>();
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
list1.add(i);
}
});
Thread thread2 = new Thread(() -> {
for (int i = 99; i >= 0; i--) {
list2.add(i);
}
});
thread1.start();
// thread1.join();
thread2.start();
// thread2.join();
printList(list1);
printList(list2);
}
static void printList(List<Integer> list) {
for (Integer integer : list) {
System.out.print(integer);
}
System.out.println();
}
}
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
Вот так будет работать:
public class Solution {
static List<Integer> list = new ArrayList<>();
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
synchronized(list) {
list.add(i);
}
}
});
Thread thread2 = new Thread(() -> {
for (int i = 99; i >= 0; i--) {
synchronized(list) {
list.add(i);
}
}
});
thread1.start();
thread2.start();
thread2.join();
thread1.join();
printList(list);
}
static void printList(List<Integer> list) {
for (Integer integer : list) {
System.out.println(integer);
}
System.out.println();
}
}
Обратите внимание на синхронизацию доступа к списку.