1. 双线程交替打印奇偶数
class Printer{
private int num=1;
private Object myLock = new Object();
public static void main(String[] args){
Printer p=new Printer();
Thread t1=new Thread( ()->p.printNum(true), "threadA");
t1.start();
Thread t2=new Thread( ()->p.printNum(false), "threadB");
t2.start();
}
private void printNum(boolean isOdd){
while(num<10){
synchronized (myLock){
while( (isOdd && num%2==0) || (!isOdd && num%2!=0)){
try {
myLock.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
if(num<=10){
System.out.println(Thread.currentThread().getName()+":"+num);
num++;
myLock.notifyAll();
}
}
}
}
}

2. 三线程交替打印1-10
class Printer{
private int num=1;
private Object myLock=new Object();
public static void main(String[] args){
Printer p=new Printer();
Thread t1=new Thread( ()-> p.printNum(1), "threadA");
t1.start();
Thread t2=new Thread( ()-> p.printNum(2), "threadB");
t2.start();
Thread t3=new Thread( ()-> p.printNum(0), "threadC");
t3.start();
}
void printNum(int need){
while(num<10){
synchronized (myLock) {
while (num % 3 != need) {
try {
myLock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(num<=10){
System.out.println(Thread.currentThread().getName()+":"+num);
num++;
myLock.notifyAll();
}
}
}
}
}

3. 三线程各打印1 2 3,分别打印5次
class Printer{
private int condition=1;
private Object myLock = new Object();
public static void main(String[] args){
Printer p = new Printer();
Thread t1=new Thread( () -> p.printNum(1), "threadA");
t1.start();
Thread t2=new Thread( () -> p.printNum(2), "threadB");
t2.start();
Thread t3=new Thread( () -> p.printNum(3), "threadC");
t3.start();
}
private void printNum(int need){
for(int i=0;i<5;i++){
synchronized (myLock){
while(condition!=need){
try {
myLock.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println(Thread.currentThread().getName()+":"+need);
condition=(condition%3)+1;
myLock.notifyAll();
}
}
}
}

4. 三个线程分别交替打印A B C,各5次
class Printer{
private int condition=1;
private Object myLock = new Object();
public static void main(String[] args){
Printer p = new Printer();
Thread t1=new Thread( () -> p.printNum(1), "threadA");
t1.start();
Thread t2=new Thread( () -> p.printNum(2), "threadB");
t2.start();
Thread t3=new Thread( () -> p.printNum(3), "threadC");
t3.start();
}
private void printNum(int need){
for(int i=0;i<5;i++){
synchronized (myLock){
while(condition!=need){
try {
myLock.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.printf("%s:%c\n",Thread.currentThread().getName(), need+64);
condition=(condition%3)+1;
myLock.notifyAll();
}
}
}
}
