通过n个线程顺序打印26个英文字母,例如 n=3 则输出:

thread0: a

thread1: b

thread2: c

thread0: d

方案一:轮询

多个线程不断轮询是否是该线程执行任务。因为线程要不断轮循,所以效率较低。

答案

import java.util.*;

/**
* n个线程顺序打印英文字母
*/
class Solution {
//用于更换线程
private volatile static int current = 0; public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int in = scanner.nextInt();
int max = 25;
for (int i = 0; i < in; i++) {
new Thread(new Print(in, i, max), "Thread:" + i).start();
}
} static class Print implements Runnable {
//线程总数
private final int num;
//当前线程号
private final int no;
//与current配合更换线程
private final int max; public Print(int num, int no, int max) {
this.num = num;
this.no = no;
this.max = max;
} @Override
public void run() {
while (current <= max) {
if (current % num == no) {
synchronized (Print.class) {
if (current <= max) {
System.out.println(Thread.currentThread().getName() + ":" + (char)(97 + current));
current++;
}
}
}
}
}
} }

测试

Thread:0:a

Thread:1:b

Thread:2:c

Thread:0:d

Thread:1:e

Thread:2:f

Thread:0:g

Thread:1:h

Thread:2:i

Thread:0:j

Thread:1:k

Thread:2:l

Thread:0:m

Thread:1:n

Thread:2:o

Thread:0:p

Thread:1:q

Thread:2:r

Thread:0:s

Thread:1:t

Thread:2:u

Thread:0:v

Thread:1:w

Thread:2:x

Thread:0:y

Thread:1:z

方案二:condition

对于ReentrantLock,里面提供了newCondition方法,对于每一个线程,其await的时候都可以关联一个Condition对象,别的线程也可以通知这个condition对象进行唤醒。因为每个线程拿到锁以后会做判断,不是他的任务直接就进入等待状态挂起了,所以效率好一些。注意最后判断线程是否要进行挂起的条件,如果之后没有它要进行的任务就不要挂起了,否则最后进程可能执行不完。

import java.util.*;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; /**
* n个线程顺序打印英文字母
*/
class Solution {
//用于更换线程
private static int current = 0;
private static final ReentrantLock lock = new ReentrantLock();
private static final ArrayList<Condition> conditions = new ArrayList<>(); public static void main(String[] args) {
//输入的数必须大于1
Scanner scanner = new Scanner(System.in);
int in = scanner.nextInt();
int max = 25; //为每个线程设置等待条件
for (int i = 0; i < in; i++) {
conditions.add(lock.newCondition());
} for (int i = 0; i < in; i++) {
new Thread(new Print(in, i, max), "Thread:" + i).start();
}
} static class Print implements Runnable {
//线程总数
private final int num;
//当前线程号
private final int no;
//与current配合更换线程
private final int max; public Print(int num, int no, int max) {
this.num = num;
this.no = no;
this.max = max;
} @Override
public void run() {
while (current <= max) {
try {
lock.lock();
if (current % num == no) {
if (current <= max) {
System.out.println(Thread.currentThread().getName() + ":" + (char)(97 + current));
current++;
}
conditions.get((no + 1) % num).signal();
if (current < max && max - current >= num) {
conditions.get(no).await();
}
} else {
if (current < max && max - current >= num) {
conditions.get(no).await();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} }
}
}

测试:

Thread:0:a

Thread:1:b

Thread:2:c

Thread:3:d

Thread:4:e

Thread:0:f

Thread:1:g

Thread:2:h

Thread:3:i

Thread:4:j

Thread:0:k

Thread:1:l

Thread:2:m

Thread:3:n

Thread:4:o

Thread:0:p

Thread:1:q

Thread:2:r

Thread:3:s

Thread:4:t

Thread:0:u

Thread:1:v

Thread:2:w

Thread:3:x

Thread:4:y

Thread:0:z

Process finished with exit code 0

通过n个线程顺序打印26个英文字母的更多相关文章

  1. python3打印26个英文字母

    for a in range(ord('a'), ord('z') + 1): print(chr(a) , end="") for a in range(ord('A'), or ...

  2. Java多个线程顺序打印数字

    要求 启动N个线程, 这N个线程要不间断按顺序打印数字1-N. 将问题简化为3个线程无限循环打印1到3 方法一: 使用synchronized 三个线程无序竞争同步锁, 如果遇上的是自己的数字, 就打 ...

  3. 【多线程基础】- 多个线程顺序打印ABC

    题目:3个线程名字分别是A,B,C 现在在console上连续打印10次 ABC . public class Test { public static void main(String[] args ...

  4. Linux 多线程按照线程顺序打印字符

    #include <stdio.h> #include <pthread.h> #include <unistd.h> ; pthread_mutex_t mute ...

  5. Java小技巧输出26个英文字母

    相信有的童鞋写到过与字母有关的小东西,是否有写过全部的字母呢?26个这么多字母,一个个打会疯掉.所有咱们可以用一个小技巧使用for循环帮我们把26个字母自动搞出来,大家来瞅一眼把! 使用Java遍历2 ...

  6. 利用ascii码生成26个英文字母

    <script> let a = ""; for (var i = 65; i < 91; i++) { a += String.fromCharCode(i); ...

  7. python 一句话输出26个英文字母

    chr(i) # return i character ord(c) # return integer >>> [chr(i) for i in range(97,123)] ['a ...

  8. Java 【打印俄文的英文字母】

    俄文的的字符可以用 'A' 到 'Я '. public class main { public static void main(String args[]) { char S = 'А', C = ...

  9. [No00002A]26个英语字母的原始象形意义、含义、产生及发展历史

    我们都知道汉字是象形文字,但如果说英语也是象形文字,你一定会以为纯是无稽之谈.其实,追根溯源,英语的26个字母确实来自于象形文字.这26个字母最初起源于埃及象形文字,后由腓尼基人改进发明了腓尼基字母, ...

  10. java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现

    注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...

随机推荐

  1. spring mvc问题:源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示

    HTTP状态 404 - 未找到 类型 状态报告 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示. 我的问题:spring mvc无法访问到映射的controller,页面显 ...

  2. nginx从仅支持80到支持80和443

    测试环境的域名,之前只支持http.开发同学不知啥时候改了数据库配置,导致所有跳转到到了https了.所以得加上https访问. 配置文件之前是这样的: 1 server { 2 listen 80; ...

  3. 《基于Linux平台实现定时器功能》

    1.demo static void sigHandFun(int signum) { struct itimerval itv; itv.it_interval.tv_sec = 5; itv.it ...

  4. params的使用

    今天在写vue的JavaScript的时候有个地方需要传很多参数,自己写不出来,求助 我的博博 后拿到神奇代码: 神奇代码中有params,俺自作聪明,以为他是一个json的数据,所以自己改了个名字 ...

  5. (Python)email 邮件发送

    """ 1. 发送邮件的几个步骤: 1)与邮件服务器建立会话连接 2)指定用户的登录 3)发送邮件 2. 一个标准邮件包含: 1)邮件头:标题:收件人.发送人.抄送cc. ...

  6. 【uni-app】第2节HBuilderX未检测到手机问题(今天终于找到解决办法了,亲测可以)

        1.[问题描述]项目想在真机调试,开发者选项已开启USB调试,但是HBuilderX未检测到手机或模拟器     2.[解决办法]             2.1 找到HBuilderX安装目 ...

  7. Tomcat异常处理机制

    声明 源码基于Spring Boot 2.3.12中依赖的Tomcat 异常例子 tomcat中返回错误页面目前主要是以下两种情况. 执行servlet发生异常 程序中主动调用response.sen ...

  8. gitlab+jenkins配置自动触发构建

    1.jenkins安装gitlab插件 2.启动gitlab容器 docker run -itd -v /opt/gitlab/etc:/etc/gitlab -v /opt/gitlab/log:/ ...

  9. Excel 的盒须图 离群值 Outliers

    Excel 中的盒须图 翻译自https://www.excel-easy.com/examples/box-whisker-plot.html 本示例教您如何在Excel中创建盒须图.盒须图显示了数 ...

  10. Dynamics CRM 安全模型的性能问题

    性能问题对系统的影响可以是致命性的,一旦不重视,在不久的将来随时可能爆发,导致系统卡顿甚至无法操作,即时重启也无济于事:甚至极其难以发现.这里为自己记录一下过往的经验.系统一开始的设计,很大程度上决定 ...