помогите разобраться с многопоточкой

Ковыряю многопоточку, пробую заполнить лист числами параллельно, а потом вывести в консоль.
И насколько я понимаю, 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();
    }

}

Обратите внимание на синхронизацию доступа к списку.

→ Ссылка