很久之前遇到的一个面试题,要求是指定一个数值(如100),线程1打印1、2、3,线程2打印4、5、6,如此反复,到指定数值(100)时程序结束,当时并没有做出来,回来之后在网上查看了些博客,也有了思路,虽然也做出来了,但并没有完全领会,今天看到线程的有序性,事隔多年,自己又动手实现了一次,也夯实了一下基础知识。话不多说,上代码 ^_^
public class ThreadAlternatePrint extends Thread{
private Object lock;
private static final Integer counter = 100;
private volatile static boolean execFlag = false;
private int printCount=0;
private volatile static int addNumber=1;
public ThreadAlternatePrintDemoExt(Object lock) {
this.lock = lock;
}
@Override
public void run() {
try {
synchronized (lock){
while (addNumber <= counter){
if (!execFlag) {
if (addNumber > counter) {
return;
}
System.out.println(Thread.currentThread().getName() + " 打印 " + addNumber);
lock.notify();
printCount++;
addNumber++;
execFlag = false;
if (printCount == 3) {
execFlag = true;
printCount = 0;
lock.wait();
}
}
if (execFlag) {
if (addNumber > counter) {
return;
}
System.out.println(Thread.currentThread().getName() + " 打印 " + addNumber);
lock.notify();
printCount++;
addNumber++;
execFlag=true;
if (printCount == 3) {
execFlag = false;
printCount = 0;
lock.wait();
}
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Object lock = new Object();
ThreadAlternatePrint t = new ThreadAlternatePrint(lock);
ThreadAlternatePrint t1 = new ThreadAlternatePrint(lock);
t.start();
t1.start();
}
}
实现的效果如下:
Thread-0 打印 1
Thread-0 打印 2
Thread-0 打印 3
Thread-1 打印 4
Thread-1 打印 5
Thread-1 打印 6
Thread-0 打印 7
Thread-0 打印 8
Thread-0 打印 9
Thread-1 打印 10
Thread-1 打印 11
Thread-1 打印 12
Thread-0 打印 13
Thread-0 打印 14
Thread-0 打印 15
Thread-1 打印 16
Thread-1 打印 17
Thread-1 打印 18
Thread-0 打印 19
Thread-0 打印 20
Thread-0 打印 21
Thread-1 打印 22
Thread-1 打印 23
Thread-1 打印 24
Thread-0 打印 25
Thread-0 打印 26
Thread-0 打印 27
Thread-1 打印 28
Thread-1 打印 29
Thread-1 打印 30
Thread-0 打印 31
Thread-0 打印 32
Thread-0 打印 33
Thread-1 打印 34
Thread-1 打印 35
Thread-1 打印 36
Thread-0 打印 37
Thread-0 打印 38
Thread-0 打印 39
Thread-1 打印 40
Thread-1 打印 41
Thread-1 打印 42
Thread-0 打印 43
Thread-0 打印 44
Thread-0 打印 45
Thread-1 打印 46
Thread-1 打印 47
Thread-1 打印 48
Thread-0 打印 49
Thread-0 打印 50
Thread-0 打印 51
Thread-1 打印 52
Thread-1 打印 53
Thread-1 打印 54
Thread-0 打印 55
Thread-0 打印 56
Thread-0 打印 57
Thread-1 打印 58
Thread-1 打印 59
Thread-1 打印 60
Thread-0 打印 61
Thread-0 打印 62
Thread-0 打印 63
Thread-1 打印 64
Thread-1 打印 65
Thread-1 打印 66
Thread-0 打印 67
Thread-0 打印 68
Thread-0 打印 69
Thread-1 打印 70
Thread-1 打印 71
Thread-1 打印 72
Thread-0 打印 73
Thread-0 打印 74
Thread-0 打印 75
Thread-1 打印 76
Thread-1 打印 77
Thread-1 打印 78
Thread-0 打印 79
Thread-0 打印 80
Thread-0 打印 81
Thread-1 打印 82
Thread-1 打印 83
Thread-1 打印 84
Thread-0 打印 85
Thread-0 打印 86
Thread-0 打印 87
Thread-1 打印 88
Thread-1 打印 89
Thread-1 打印 90
Thread-0 打印 91
Thread-0 打印 92
Thread-0 打印 93
Thread-1 打印 94
Thread-1 打印 95
Thread-1 打印 96
Thread-0 打印 97
Thread-0 打印 98
Thread-0 打印 99
Thread-1 打印 100