/** * 顺序打印-进阶版 * * 有三个线程,分别只能打印A,B和C * 要求按顺序打印ABC,打印10次 * 输出示例: * ABC * ABC * ABC * ...... * * 解法:使用循环数组配合线程通信 */ public class Demo { // 要输出的信息数组 private static String[] INFO = {"A","B","C"}; // 数组下标 private static volatile int INDEX = 0; // 打印次数 private static final int NUM = 10; // 线程所包含的任务 static class Task implements Runnable{ private String info; //需要打印的字符串信息 public Task(String info) { this.info = info; } @Override public void run() { //循环打印 for (int i = 0; i < NUM; i++) { //获取同步锁 synchronized (Task.class){ //检查是否轮到当前线程 while(!info.equals(INFO[INDEX])){ //每次唤醒都需要判断是否满足条件 try { //不满足条件则主动等待并释放锁 Task.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //输出字符串信息 System.out.print(info); //若输出信息是最后一个时则换行 if(INDEX == INFO.length - 1){ System.out.println(); } //轮到下一个线程打印 INDEX = (INDEX + 1) % INFO.length; Task.class.notifyAll(); } } } } public static void main(String[] args) { new Thread(new Task("A")).start(); new Thread(new Task("B")).start(); new Thread(new Task("C")).start(); } }
package concurrent; import java.util.concurrent.locks.LockSupport; public class LockSupportDemo2 { static Thread A,B,C; public static void main(String[] args) { A = new Thread(()->{ for (int i = 0; i < 10; i++) { LockSupport.park(); System.out.print("A"); LockSupport.unpark(B); } }); B = new Thread(()->{ for (int i = 0; i < 10; i++) { LockSupport.park(); System.out.print("B"); LockSupport.unpark(C); } }); C = new Thread(()->{ for (int i = 0; i < 10; i++) { LockSupport.unpark(A); LockSupport.park(); System.out.print("C"); } }); A.start(); B.start(); C.start(); } }
class Task3{ private volatile boolean firstDone; private volatile boolean secondDone; private volatile boolean thirdDone = true; volatile int sum =0; void first(){ while (true){ while (!thirdDone){ //等待第三个线程的完成 } sum++; System.out.println(Thread.currentThread().getName()+" : A 计数:"+sum); thirdDone=false; firstDone=true; if(sum==28)return; } } void second(){ while (true){ while (!firstDone){ //等待一个线程完成 } sum++; System.out.println(Thread.currentThread().getName()+" : B 计数:"+sum); secondDone=true; firstDone=false; if(sum==29)return; } } void third(){ while (true){ while (!secondDone){ //等待第二线程完成 } sum++; System.out.println(Thread.currentThread().getName()+" : C 计数:"+sum); System.out.println("==================================================="); secondDone=false; thirdDone=true; if(sum==30)return; } } }
public void test() { for (int x = 1; x <= 10; x++) { CompletableFuture.runAsync(() -> { System.out.println("线程A" ); }).thenRunAsync(() -> { System.out.println("线程B"); }).thenRunAsync(() -> { System.out.println("线程C"); }); try { TimeUnit.SECONDS.sleep(1); }catch (Exception e) { e.printStackTrace(); } } }
package real; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class DiffPrint { private volatile int num = 0; private Lock lock = new ReentrantLock(); private Condition a = lock.newCondition(), b = lock.newCondition(), c = lock.newCondition(); public void printA() { while (num < 30) { lock.lock(); while (num > 0 && num % 3 != 0) { try { a.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("a"); num++; b.signal(); lock.unlock(); } } public void printB() { while (num < 30) { lock.lock(); while (num % 3 != 1) { try { b.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("b"); num++; c.signal(); lock.unlock(); } } public void printC() { while (num < 30) { lock.lock(); while (num % 3 != 2) { try { c.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("c"); num++; a.signal(); lock.unlock(); } } public static void main(String[] args) { DiffPrint dp = new DiffPrint(); new Thread(() -> { dp.printA(); }).start(); new Thread(() -> { dp.printB(); }).start(); new Thread(() -> { dp.printC(); }).start(); } }
package com.lyr.common.demo.aqs; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Map; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * @Author lyr * @create 2021/1/27 22:27 */ public class SimpleLock { public static void main(String[] args) throws Exception { new Thread(()->{ synchronized (lock) { while (modCount<30) { if (A=='A') { modCount++; System.out.println(A); A++; }else{ lock.notifyAll(); try { // if (modCount>=30) break; lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } lock.notifyAll(); } }).start(); new Thread(()->{ synchronized (lock) { while (modCount<30) { if (A=='B'){ modCount++; System.out.println( A); A++; }else{ try { lock.notifyAll(); // if (modCount>=30) break; lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } lock.notifyAll(); } }).start(); new Thread(()->{ synchronized (lock) { while (modCount<30) { if (A=='C') { modCount++; System.out.println( A ); A = 'A'; }else{ lock.notifyAll(); // if (modCount>=30) break; try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } lock.notifyAll(); } }).start(); } volatile static char A = 'A'; volatile static Object lock = new Object(); volatile static int modCount = 0; }
@Data static class Test implements Runnable { private static Integer totalNum = 0; private static String[] order; private Integer printTimes; private String name; public Test(String name, Integer printTimes) { this.name = name; this.printTimes = printTimes; } @Override public void run() { int startNum = 1; while (startNum <= printTimes) { if (currentName(totalNum).equals(name)) { System.out.print(name); startNum++; totalNum++; try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); break; } } } } public String currentName(Integer totalNum) { return order[totalNum % order.length]; } } public static void main(String[] args) { Test.order = new String[]{"A", "B", "C"}; new Thread(new Test("A", 10)).start(); new Thread(new Test("B", 10)).start(); new Thread(new Test("C", 10)).start(); }