package com.zs.test;
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadTest2 {
private static volatile AtomicInteger num = new AtomicInteger(0);
private static volatile AtomicInteger abcNum = new AtomicInteger(65);
private static boolean isPrintNumContinue = true;
private static byte[] lock = new byte[0];
public static void main(String[] args) {
printNum();
printABC();
}
public static void printNum(){
new Thread(
() -> {
while (num.get()<52){
synchronized (lock){
if(isPrintNumContinue){
System.out.print(num.incrementAndGet());
if(num.get()%2==0){
isPrintNumContinue = false;
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
})
.start();
}
public static void printABC(){
new Thread(
() -> {
while (abcNum.get()<=90){
synchronized (lock){
if(!isPrintNumContinue){
System.out.print( (char)abcNum.getAndIncrement());
isPrintNumContinue = true;
lock.notify();
}
}
}
})
.start();
}
}
方法二:
public static void printNum() {
new Thread(
() -> {
while (num.get() < 52) {
while (!isPrintNumContinue) {
Thread.yield();
}
System.out.print(num.incrementAndGet());
if (num.get() % 2 == 0) {
isPrintNumContinue = false;
}
}
})
.start();
}
public static void printABC() {
new Thread(
() -> {
while (abcNum.get() <= 90) {
while (isPrintNumContinue) {
Thread.yield();
}
System.out.print((char) abcNum.getAndIncrement());
System.out.print(" ");
isPrintNumContinue = true;
}
})
.start();
}
方法三:
public static void printNum() {
t1 = new Thread(
() -> {
while (num.get() < 52) {
System.out.print(num.incrementAndGet());
if (num.get() % 2 == 0) {
LockSupport.unpark(t2);
LockSupport.park();
}
}
}, "t1");
t1.start();
}
public static void printABC() {
t2 = new Thread(
() -> {
while (abcNum.get() <= 90) {
LockSupport.park();
System.out.print((char) abcNum.getAndIncrement());
System.out.print(" ");
LockSupport.unpark(t1);
}
}, "t2");
t2.start();
}