import java.util.concurrent.LinkedBlockingQueue;

public class Main {
    static LinkedBlockingQueue<Message> messageQueue = new LinkedBlockingQueue<>();

    enum Message { END }

    static class Thread1 implements Runnable {
        @Override
        public void run() {
            System.out.println("From thread1");
            Main.messageQueue.add(Message.END);
        }
    }

    static class Thread2 implements Runnable {
        @Override
        public void run() {
            System.out.println("From thread2");
            Main.messageQueue.add(Message.END);
        }
    }

    public static void main(String[] args) throws java.lang.InterruptedException {
        (new Thread(new Thread1())).start();
        (new Thread(new Thread2())).start();
        int endedThreads = 0;
        while(true){
            Message t = messageQueue.take();
            if(t == Message.END) {
                endedThreads += 1;
                if(endedThreads == 2) {
                    break;
                }
            }
        }
        System.out.println("Quit program");
    }
}
