【快手初面】要求3个线程按顺序循环执行,如循环打印A,B,C
【背景】这个题目是当时远程面试时,手写的题目。自己比较惭愧,当时写的并不好,面试完就又好好的完善了下。
一、题意分析
3个线程要按顺序执行,就要通过线程通信去控制这3个线程的执行顺序。
而线程通信的方式就有wait/notify, condition#await, condition#signal等
二、具体代码
 public class Main {
     private static String lastCompleteStr = "C";
     public static void main(String[] args) {
         new Thread(new PrintTask("A", "C")).start();
         new Thread(new PrintTask("B", "A")).start();
         new Thread(new PrintTask("C", "B")).start();
     }
     static class PrintTask implements Runnable {
         private String cur;
         private String waitLastStr;
         public PrintTask(String cur, String waitLastStr) {
             this.cur = cur;
             this.waitLastStr = waitLastStr;
         }
         @Override
         public void run() {
             try {
                 while (true) {
                     synchronized (Main.class) {
                         while (!lastCompleteStr.equals(waitLastStr)) {
                             Main.class.wait();
                         }
                         System.out.println(cur);
                         lastCompleteStr = cur;
                         Main.class.notifyAll();
                     }
                 }
             } catch (Exception e ) {
                 e.printStackTrace();
             }
         }
     }
 }

【快手初面】要求3个线程按顺序循环执行,如循环打印A,B,C的更多相关文章
- Hadoop源码学习笔记(3) ——初览DataNode及学习线程
		Hadoop源码学习笔记(3) ——初览DataNode及学习线程 进入了main函数,我们走出了第一步,接下来看看再怎么走: public class DataNode extends Config ... 
- delphi.thread.线程循环执行体结构
		线程话题太大,又都是些坑,不知从哪方面讲起,所以,想一出是一出了. 不管怎样,我们从开始使用D,不管有没有用线程,其实它已经帮我们做了一个最完整的线程执行处理:Application.Run. 这行A ... 
- C# 多线程join的用法,等待多个子线程结束后再执行主线程
		等待多个子线程结束后再执行主线程 class MultiThread{ #region join test public void MultiThreadTest() { Thread[] ths = ... 
- TestNg线程池配置、执行次数配置、超时配置
		使用注解的方式对TestNg线程池配置.执行次数配置.超时配置 注:使用注解来控制测试方法运行的次数和超时时间,timeOut在单线程或者多线程模式下都可用,threadPoolSize设置了线程池的 ... 
- C#之使用AutoResetEvent实现线程的顺序执行
		前几天一朋友问我如何实现线程的顺序执行,说真的,虽然看过CLR这本书,也把线程部分拜读了两遍,但是这个问题出来之后还是没有一个思路.今天在搜索资料的时候无意中再次看到AutoResetEvent这个东 ... 
- C# 线程知识--使用ThreadPool执行异步操作
		C# 线程知识--使用ThreadPool执行异步操作 在应用程序中有许多复杂的任务,对于这些任务可能需要使用一个或多个工作线程或I/O线程来协作处理,比如:定时任务.数据库数据操作.web服务.文件 ... 
- C# 线程知识--使用Task执行异步操作
		在C#4.0之前需要执行一个复杂的异步操作时,只能使用CLR线程池技术来执行一个任务.线程池执行异步任务时,不知道任务何时完成,以及任务的在任务完成后不能获取到返回值.但是在C#4.0中引人了一个的任 ... 
- 用三个线程按顺序循环打印ABC三个字母
		有两种方法:semaphore信号量和mutex互斥锁.需要注意的是C++11已经没有semaphore. C++ 并发编程(六):信号量(Semaphore) - 止于至善 - SegmentFau ... 
- Qt 控制线程的顺序执行(使用QWaitCondition,并且线程类的run函数里记得加exec(),使得线程常驻)
		背景项目中用到多线程,对线程的执行顺序有要求: A.一个线程先收数据 B.一个线程处理数据 C.一个线程再将处理后的数据发送出去 要求三个线程按照ABC的顺序循环执行. 思路子类化多线程方法 重写子类 ... 
- 如何让线程A等待B执行结束后执行?
		1. 使用条件变量 判断是否任务B已经做完,然后再执行任务A. 测试代码可看:https://blog.csdn.net/guochao6531/article/details/78075882 2. ... 
随机推荐
- mysql安装之后需要调的参数
			http://www.mysqlperformanceblog.com/2014/01/28/10-mysql-settings-to-tune-after-installation/ 翻译加深理解. ... 
- Redux:data flow
			我们使用react,是为了构建可复用的高性能的视图层,学习redux是为了处理视图组件中随应用复杂度提升而变得难以控制的state.说白了,是为了视图. 在了解了action.reducer和stor ... 
- python操作excel----openpyxl模块
			openpyxl模块支持.xls和.xlsx格式的excel创建,但是只支持.xlsx格式的读取操作,不支持.xls的读取(可以使用xlrd模块来读取,写入操作也可使用xlwt模块),也可使用pand ... 
- 如何将你的node服务放到线上服务器
			最近在用node写后端数据处理,以前虽然也用node写数据来进行测试,但是一直都是处于本地使用, 今天想将node作为后端服务来处理数据, 特此,以此博客记录. 第一步,写node 接口, 在本地我们 ... 
- 基于 abp vNext 和 .NET Core 开发博客项目 - 接入GitHub,用JWT保护你的API
			上一篇文章(https://www.cnblogs.com/meowv/p/12924859.html)再次把Swagger的使用进行了讲解,完成了对Swagger的分组.描述和开启小绿锁以进行身份的 ... 
- PAT-1059 Prime Factors (素数因子)
			1059. Prime Factors Given any positive integer N, you are supposed to find all of its prime factors, ... 
- SICP 题解集合
			1.1(略) 1.2 biwascheme> (/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5))))) (* 3 (- 6 2) (- 2 7))) => -0.24666 ... 
- 【MySQL】覆盖索引和回表
			先来了解一下两大类索引 聚簇索引(也称聚集索引,主键索引等) 普通索引(也成非聚簇索引,二级索引等) 聚簇索引 如果表设置了主键,则主键就是聚簇索引 如果表没有主键,则会默认第一个NOT NULL,且 ... 
- Python可变对象和不可变对象
			Python中一切皆对象,每个对象都有其唯一的id,对应的类型和值,其中id指的是对象在内存中的位置.根据对象的值是否可修改分为可变对象和不可变对象.其中, 不可对象包括:数字,字符串,tuple 可 ... 
- 约瑟夫环(超好的代码存档)--19--约瑟夫环--LeetCode面试题62(圆圈最后剩下的数字)
			圆圈中最后剩下的数字 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0 ... 
