public class ThreadCommunication { public static void main(String[] args) { Business business = new Business(); new Thread(() -> { while (true) { try { business.thread1(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); new Thread(() -> { while (true) { try { business.thread2(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } } class Business { private boolean thread1First = true; public synchronized void thread1() throws InterruptedException { while (!thread1First) { this.wait(); } thread1First = !thread1First; this.notify(); System.out.println("thread 1 is called!!!"); Thread.sleep(1000); } public synchronized void thread2() throws InterruptedException { while (thread1First) { this.wait(); } thread1First = !thread1First; this.notify(); System.out.println("thread 2 is invoked"); Thread.sleep(1000); } }