多线程的同步
一般来说,线程默认都是异步执行,也就是再执行的过程中,多个线程会抢CPU,会导致电脑崩溃的现象,而使用线程同步后,每个线程会按照一定的次序来运行。
举个例子来说,上班挤公交就是生活常见的现象。线程默认的异步,也就是现在有很多人(假设10人)同时在挤公交,有可能会发生意外冲突,而线程同步是10个人排着队按照一定的次序上车,不会产生冲突现象。
public class Test1 {
//线程执行
static int state = 0;
//设置锁
static Object lock = new Object();
private static class PrintTask implements Runnable{
/**当前标志位*/
private int nowFlag;
/**下一个标志位*/
private int nextFlag;
/**当前线程打印的字符串*/
private String printString;
public PrintTask(int nowFlag, int nextFlag, String printString) {
this.nowFlag = nowFlag;
this.nextFlag = nextFlag;
this.printString = printString;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
synchronized (lock) {
//当前线程与线程执行的不一致时,线程处于阻塞状态
while(state != nowFlag) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//打印字符串
System.out.println(printString);
//改变标志位
state = nextFlag;
//通知所有线程
lock.notifyAll();
}
}
}
}
public static void main(String[] args) {
//第一个要从0开始是因为上面定义的线程state = 0
//然后每一次上一个线程的第一个位置与上一个线程的下一个位置要相同
//这是每次再执行完线程后修改了标志位state = nextFlag;
//在后面还可以添加更多的线程,线程安全并且会按照次序运行
Thread t1 = new Thread(new PrintTask(0, 1, "A"));
Thread t2 = new Thread(new PrintTask(1, 5, "B"));
Thread t3 = new Thread(new PrintTask(5, 3, "C"));
Thread t4 = new Thread(new PrintTask(3, 0, "D"));
t1.start();
t2.start();
t3.start();
t4.start();
}
}
`