import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 两个线ç¨äº¤æ¿æ§è¡æå° 1~100 */ public class TwoThread { private int start = 1; /** * ä¿è¯å åå¯è§æ§ * å ¶å®ç¨éäºä¹åä¹å¯ä»¥ä¿è¯å¯è§æ§ è¿éç¨ä¸ç¨ volatile é½ä¸æ · */ private boolean flag = false; /** * éå ¥é */ private final static Lock LOCK = new ReentrantLock(); public static void main(String[] args) { TwoThread twoThread = new TwoThread(); Thread t1 = new Thread(new EvenNumberThread(twoThread)); t1.setName("t1"); Thread t2 = new Thread(new OddNumberThread(twoThread)); t2.setName("t2"); t1.start(); t2.start(); } /** * å¶æ°çº¿ç¨ */ public static class EvenNumberThread implements Runnable { private TwoThread number; EvenNumberThread(TwoThread number) { this.number = number; } @Override public void run() { while (number.start < 100) { if (number.flag) { try { LOCK.lock(); System.out.println(Thread.currentThread().getName() + "+-+" + number.start); number.start++; number.flag = false; } finally { LOCK.unlock(); } } else { try { //鲿¢çº¿ç¨ç©ºè½¬ Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } } } /** * 奿°çº¿ç¨ */ public static class OddNumberThread implements Runnable { private TwoThread number; OddNumberThread(TwoThread number) { this.number = number; } @Override public void run() { while (number.start <= 100) { if (!number.flag) { try { LOCK.lock(); System.out.println(Thread.currentThread().getName() + "+-+" + number.start); number.start++; number.flag = true; } finally { LOCK.unlock(); } } else { try { //鲿¢çº¿ç¨ç©ºè½¬ Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } } } }