- 1.使用synchronized
public static void main(String[] args) { new Thread(new MyThread(),"p1").start(); new Thread(new MyThread(),"p2").start(); } static class MyThread implements Runnable{ public MyThread() { super(); } @Override public void run() { synchronized (MyThread.class){ for (int i = 0; i < 26; i++) { if (Thread.currentThread().getName().equals("p1")) { System.out.print(i+1); MyThread.class.notifyAll(); try { MyThread.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { System.out.print((char)('A'+i)); MyThread.class.notifyAll(); try { MyThread.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } }
- 2.使用信号量Semaphore实现
static Semaphore sp1 = new Semaphore(1); static Semaphore sp2 = new Semaphore(1); public static void main(String[] args) throws InterruptedException { sp2.acquire(); new Thread(new MyThread1(sp1,sp2),"p1").start(); new Thread(new MyThread2(sp1,sp2),"p2").start(); } static class MyThread1 implements Runnable{ private Semaphore sp1; private Semaphore sp2; public MyThread1(Semaphore sp1,Semaphore sp2) { super(); this.sp1 = sp1; this.sp2 = sp2; } @Override public void run() { try { sp1.acquire(); for (int i = 0; i < 26; i++) { System.out.print(i); sp2.release(); sp1.acquire(); // TimeUnit.SECONDS.sleep(3); } } catch (InterruptedException e) { e.printStackTrace(); }finally { } } } static class MyThread2 implements Runnable{ private Semaphore sp1; private Semaphore sp2; public MyThread2(Semaphore sp1,Semaphore sp2) { super(); this.sp1 = sp1; this.sp2 = sp2; } @Override public void run() { try { sp2.acquire(); for (int i = 0; i < 26; i++) { System.out.print((char)('A'+i)); sp1.release(); sp2.acquire(); // TimeUnit.SECONDS.sleep(3); } } catch (InterruptedException e) { e.printStackTrace(); }finally { } } }