Various implementation forms of alternate printing realized by multithreading. To put it bluntly, it is to use various synchronizers in java' to realize this alternate printing requirement.
How sync is implemented
package com.AQS.JiaoTiDaYin;
/**
* @Author:XK
* @Date: Created in 12:00 2022/4/20
* @Description:多线程交替打印的多种实现方法 (sync)
**/
public class JiaotiDayinSync {
private static int counter=0;
private static Object object= new Object();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
int cnt = 0;
while (cnt<3){
synchronized (object){
if(counter%3!=0){
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println("1");
cnt++;
counter++;
}
object.notifyAll();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
int cnt = 0;
while (cnt<3){
synchronized (object){
if(counter%3!=1){
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println("2");
cnt++;
counter++;
}
object.notifyAll();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
int cnt = 0;
while (cnt<3){
synchronized (object){
if(counter%3!=2){
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println("3");
cnt++;
counter++;
}
object.notifyAll();
}
}
}
}).start();
}
}
Implementation of lock class ReentrantLock
package com.AQS.JiaoTiDaYin;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Author:XK
* @Date: Created in 12:10 2022/4/20
* @Description:lock实现 ReentrantLock实现
**/
public class Lock123 {
private static int state = 0;
private static Lock lock= new ReentrantLock();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 3;) {
lock.lock();
try {
while (state%3==0){
System.out.println(1);
state++;
i++;
}
}finally {
lock.unlock();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 3;) {
lock.lock();
try {
while (state%3==1){
System.out.println(2);
state++;
i++;
}
}finally {
lock.unlock();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 3;) {
lock.lock();
try {
while (state%3==2){
System.out.println(3);
state++;
i++;
}
}finally {
lock.unlock();
}
}
}
}).start();
}
}
Semaphore semaphore implementation
package com.AQS.JiaoTiDaYin;
import java.util.concurrent.Semaphore;
/**
* @Author:XK
* @Date: Created in 14:41 2022/4/20
* @Description:
**/
public class Sema123 {
private static Semaphore A = new Semaphore(1);
private static Semaphore B = new Semaphore(0);
private static Semaphore C = new Semaphore(0);
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
try {
A.acquire();
System.out.println(1);
B.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
try {
B.acquire();
System.out.println(2);
C.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
try {
C.acquire();
System.out.println(3);
A.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}