Java 交替打印两个线程的种方法
Posted 一窝小猪仔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 交替打印两个线程的种方法相关的知识,希望对你有一定的参考价值。
1 锁 + wait + notify
public class PrintTwoThreads {
private static int i = 0;
private static final Integer mtx = 0;
private static final int MAX_PRINT_NUMBER = 9;
public static void main(String[] args) {
new Thread(() -> {
while(i <= MAX_PRINT_NUMBER) {
synchronized (mtx) {
if ((i & 1) == 1) {
try {
mtx.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("Thread1: " + i++);
mtx.notify();
}
}
}
}).start();
new Thread(() -> {
while(i <= MAX_PRINT_NUMBER) {
synchronized (mtx) {
if ((i & 1) == 0) {
try {
mtx.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("Thread2: " + i++);
mtx.notify();
}
}
}
}).start();
}
}
2 Lock + Condition
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class PrintTwoThreads {
private static int i = 0;
private static final int MAX_PRINT_NUMBER = 9;
public static void main(String[] args) {
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
new Thread(() -> {
while(i <= MAX_PRINT_NUMBER) {
try {
lock.lock();
if ((i & 1) == 1) {
condition.await();
} else {
System.out.println("Thread1: " + i++);
condition.signal();
}
} catch (Exception e) {
System.out.println(e);
} finally {
lock.unlock();
}
}
}).start();
new Thread(() -> {
while(i <= MAX_PRINT_NUMBER) {
try {
lock.lock();
if ((i & 1) == 0) {
condition.await();
} else {
System.out.println("Thread2: " + i++);
condition.signal();
}
} catch (Exception e) {
System.out.println(e);
} finally {
lock.unlock();
}
}
}).start();
}
}
3 volatile + 自旋锁
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class PrintTwoThreads {
private static volatile int i = 0;
private static final int MAX_PRINT_NUMBER = 9;
public static void main(String[] args) {
new Thread(() -> {
while (i <= MAX_PRINT_NUMBER) {
if ((i & 1) == 0) {
System.out.println("Thread1: " + i);
i++;
}
}
}).start();
new Thread(() -> {
while (i <= MAX_PRINT_NUMBER) {
if ((i & 1) == 1) {
System.out.println("Thread2: " + i);
i++;
}
}
}).start();
}
}
以上是关于Java 交替打印两个线程的种方法的主要内容,如果未能解决你的问题,请参考以下文章