多线程打印:两个线程打印AB,三个线程打印ABC

2021-03-28 03:26

阅读:574

标签:clu   rri   not   seconds   void   lis   this   factory   override   

package club.interview.algorithm.print;

import io.netty.util.concurrent.DefaultThreadFactory;

import java.util.concurrent.*;

/**
 * 多线程打印
 * -- 2个线程交替打印 AB 换行
 * -- 3个线程交替打印 ABC 换行
 * -- 2/3个线程交替打印 HHO 换行
 * - 统一思路
 * -- 统一任务类 ,寻找执行线程,设定打印内容
 * 

* code * -- 用线程池 (规范) * -- 定义外部成员变量用final (专业) * * -- 思路来自 多线程打印 从 0 - 100 * {

@link Zero2Hundred} * @author QuCheng on 2020/9/9. */ public class ABC { /** * 自己定义打印内容,想打啥打啥 */ private final char[] threads = new char[]{‘A‘, ‘B‘, ‘C‘, ‘D‘}; /** * 打印次数 */ private final int times = 10; /** * 总计操作次数 */ private final int size = times * threads.length; /** * 开始 */ private int count = 0; private void waitNotifyCount() { ExecutorService es = new ThreadPoolExecutor(threads.length, threads.length, 0, TimeUnit.MILLISECONDS, new SynchronousQueue(), new DefaultThreadFactory("Qc")); for (int i = 0; i ) { es.execute(new Task(i)); } es.shutdown(); } class Task implements Runnable { private final int id; public Task(int id) { this.id = id; } @Override public void run() { while (true) { synchronized (Task.class) { if (count >= size) { break; } // 寻找对应的执行线程 if (count % threads.length == id) { // 设置执行的内容 if (id )) { System.out.print(threads[id]); } else { System.out.println(threads[id]); } count++; Task.class.notifyAll(); } else { try { Task.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } public static void main(String[] args) { ABC abc = new ABC(); abc.waitNotifyCount(); } }

 

多线程打印:两个线程打印AB,三个线程打印ABC

标签:clu   rri   not   seconds   void   lis   this   factory   override   

原文地址:https://www.cnblogs.com/nightOfStreet/p/13640557.html


评论


亲,登录后才可以留言!