序言
以前看过多线程交替打印奇偶数,知道大概怎么写,实际写的时候会卡住,特此记录下来
方法一:wait, notify,性能较差,不推荐使用
public class TestThread {
public static int i = 1;
public static final int TOTAL = 100;
public static Object lock = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
while (i <= TOTAL) {
synchronized (lock) {
if (i % 2 == 1) {
System.out.println("i=" + i++);
lock.notify();
} else {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
Thread thread2 = new Thread(() -> {
while (i <= TOTAL) {
synchronized (lock) {
if (i % 2 == 0) {
System.out.println("i=" + i++);
lock.notify();
} else {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
thread1.start();
thread2.start();
}
}
方法二:countDownLatch,推荐使用
public class TestThread2 {
private static AtomicInteger num = new AtomicInteger(1);
private static CountDownLatch countDownLatch = new CountDownLatch(2);
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread() {
@Override
public void run() {
while (num.intValue() < 100) {
if (num.intValue() % 2 == 1) {
System.out.println("奇数线程:"+num.intValue());
num.incrementAndGet();
}
countDownLatch.countDown();
}
}
};
Thread t2 = new Thread() {
@Override
public void run() {
while (num.intValue() <= 100) {
if (num.intValue() % 2 == 0) {
System.out.println("偶数线程:"+num.intValue());
num.incrementAndGet();
}
countDownLatch.countDown();
}
}
};
t1.start();
t2.start();
countDownLatch.await();
}
}