两条线程分别打印奇偶数
Object的线程通信方式
以来Object对象提供的wait和notify,使多条线程在等到和唤醒之间切换,要注意下边界wait的边界条件,否则可能导致现在永远处于wait中而不结束
//不一定需要volatile,因为已经sync保证了可见性
public static int num = 0;
private static Object lock = new Object();
private static CountDownLatch countDownLatch = new CountDownLatch(2);
public static void main(String[] args) throws InterruptedException {
Thread ji = new Thread(new Runnable() {
public void run() {
while (num <= 100) {
synchronized (lock) {
//这里的num还要在判断下,否则可能打出101
if (num % 2 != 0 && num <= 100) {
System.out.println("奇数打印:" + num);
num++;
lock.notifyAll();
} else {
try {
//这里要加条件进入wait,否则线程无法结束
if (num < 100) {
lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
countDownLatch.countDown();
}
});
Thread ou = new Thread(new Runnable() {
public void run() {
while (num <= 100) {
synchronized (lock) {
if (num % 2 == 0) {
System.out.println("偶数打印:" + num);
num++;
lock.notifyAll();
} else {
try {
if (num < 100) {
lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
countDownLatch.countDown();
}
});
ji.setName("jishu");
ou.setName("oushu");
ji.start();
ou.start();
countDownLatch.await();
}
AtomicInteger方式
这种方式其实是将锁放在了aotmic中去进行了,实现方式简单明了,不需要多线程之间的状态转换,推荐使用
private static AtomicInteger num = new AtomicInteger(0);
private static CountDownLatch countDownLatch = new CountDownLatch(2);
public static void main(String[] args) throws InterruptedException {
Thread ji = new Thread(new Runnable() {
public void run() {
while (num.intValue() < 100) {
if (num.intValue() % 2 != 0 ) {
System.out.println("奇数打印:" + num);
num.incrementAndGet();
}
}
countDownLatch.countDown();
}
});
Thread ou = new Thread(new Runnable() {
public void run() {
while (num.intValue() <= 100) {
if (num.intValue() % 2 == 0) {
System.out.println("偶数打印:" + num);
num.incrementAndGet();
}
}
countDownLatch.countDown();
}
});
ji.setName("jishu");
ou.setName("oushu");
ji.start();
ou.start();
countDownLatch.await();
}