JAVA并发编程练*题

发布时间:2021-11-27 11:08:18

前言

学了几天的多线程基础部分,书上的东西一看就懂,但是真的实践还是值得推敲的


题目

1、写一个程序,线程C在线程B后执行,线程B在线程A之后进行


package thread;

public class Test {

public static void main(String[] args) {
Thread threadA = new Thread(new Runnable() {

@Override
public void run() {
System.out.println("This is A");
}
});

Thread threadB = new Thread(() -> {
try {
threadA.join();
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("This is B");
});

Thread threadC = new Thread(new Runnable() {

@Override
public void run() {
try {
threadB.join();
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("This is C");
}
});
threadA.start();
threadB.start();
threadC.start();
}
}

或者这样


package thread;

public class Test2 {
public static void main(String[] args) {
Thread aThread = new Thread(() -> {
System.out.println("This is A");
});
Thread bThread = new Thread(() -> {
System.out.println("This is B");
});
Thread cThread = new Thread(() -> {
System.out.println("This is C");
});
try {
aThread.start();
aThread.join();
bThread.start();
bThread.join();
cThread.start();
cThread.join();
} catch (Exception e) {
// TODO: handle exception
}

}
}

2、编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。


第一次代码

package thread;

public class Test4 {
public static void main(String[] args) {
Thread threadA = new Thread(() -> {
System.out.println("This is A");
});

Thread threadB = new Thread(() -> {
try {
threadA.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("This is B");
});

Thread threadC = new Thread(() -> {
try {
threadB.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("This is C");
});

for (int i=0;i<10;i++) {
threadA.start();
threadB.start();
threadC.start();
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
---output----
This is A
This is B
This is C
Exception in thread "main" java.lang.IllegalThreadStateException
at java.base/java.lang.Thread.start(Thread.java:804)
at thread.Test4.main(Test4.java:30)

分析:
一开始我以为是执行地太快了,在main里面sleep了一会,结果发现还是崩了,最后google才发现,原来同样的线程不能循环执行,这和线程的生命周期有关系。销毁了之后就不能再进行了。


第二次代码

package thread;

public class Test3 {
public static void main(String[] args) {

for (int i = 0; i < 10; i++) {
Thread threadA = new Thread(() -> {
System.out.println(Thread.currentThread().getName());
}, "A");

Thread threadB = new Thread(() -> {
try {
threadA.join();
System.out.println(Thread.currentThread().getName());
} catch (Exception e) {
// TODO: handle exception
}
}, "B");

Thread threadC = new Thread(() -> {
try {
threadB.join();
System.out.println(Thread.currentThread().getName());
} catch (Exception e) {
// TODO: handle exception
}
}, "C");



threadC.start();
threadB.start();
threadA.start();
try {
Thread.sleep(300);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}

分析:
这里的sleep比较重要,因为每次都new了一个线程,主线程执行地太快,会导致新的线程先于旧线程的顺序执行。类似于插队了。但是我觉得这里new了多个线程不太好,为什么不用3个线程直接完成呢?好像不符合题目的开启3个线程这个条件


第三次代码

package thread;

public class Test {
public static class Worker {
Object lock = new Object();
int flag = 1;

public void PrintA() {
synchronized (lock) {
while (flag != 1) {
try {
lock.wait();
} catch (InterruptedException e) {
// TODO: handle exception
}
}
flag = 2;
lock.notifyAll();
System.out.println(Thread.currentThread().getName());
}
}

public void PrintB() {
synchronized (lock) {
while (flag != 2) {
try {
lock.wait();
} catch (InterruptedException e) {
// TODO: handle exception
}
}
flag = 3;
lock.notifyAll();
System.out.println(Thread.currentThread().getName());
}
}

public void PrintC() {
synchronized (lock) {
while (flag != 3) {
try {
lock.wait();
} catch (InterruptedException e) {
// TODO: handle exception
}
}
flag = 1;
lock.notifyAll();
System.out.println(Thread.currentThread().getName());
}
}

}

public static void main(String[] args) {
Worker worker = new Worker();

Thread threadA = new Thread(() -> {
for (int i = 0; i < 10; i++) {
worker.PrintA();
}
}, "A");
Thread threadB = new Thread(() -> {
for (int i = 0; i < 10; i++) {
worker.PrintB();
}
}, "B");
Thread threadC = new Thread(() -> {
for (int i = 0; i < 10; i++) {
worker.PrintC();
}
}, "C");

threadA.start();
threadB.start();
threadC.start();
}
}

相关文档

  • 怎么把小米云相册到手机
  • 沈阳五一旅游好去处
  • 一分钟 Get 时序数据库 InfluxDB 的技能
  • 关于创新的故事
  • 猪肉和牛肉、羊肉能不能放在一起吃了
  • 微芯收购Atmel得到哪些好处? 获ARM构架还窜升至MCU市场第三名
  • 给好朋友写信的范文
  • 为什么长时间不排出的乳汁会变浓乳房里的奶水时间长了会馊掉吗
  • 参加学生会自我介绍
  • 关于励志的警句格言大全
  • 七年级下册生物知识点归纳
  • PlantMoreTrees多种树
  • 公务员预备党员的思想汇报精选多篇
  • 电脑文件名太长无法删除怎么办
  • 双子座动漫人物图片
  • 三毛流浪记读后感共10篇
  • C语言学习笔记-结构体和内存对齐
  • 学习党的群众路线活动总结
  • 最简洁标准请假条格式精选多篇
  • 听雪楼黄泉喜欢谁
  • 高中数学教学论文
  • 240 搜索二维矩阵 II(脑筋急转弯)
  • 邓超婚礼钢管舞表演视频
  • 安全生产事故会议纪要范文
  • 关于劳动的作文600字 可爱劳动节
  • JSON数据格式操作(Java语言)
  • 似水年华??聂鲁达
  • Linuxan安装-安装-centos7
  • 最新多媒体专业的自我鉴定范文
  • 法制进校园黑板报素材
  • 猜你喜欢

  • 【语文专题推荐】同步综合复*小学语文小升初模拟试卷III卷
  • 五年级英语下册期中检测考试题(无答案)
  • 改革开放以来我国历次内需启动政策及其特征分析
  • nooni雪花纯净卸妆膏怎么用?nooni卸妆膏使用方法
  • 米高扬、苏斯洛夫给苏共中央的电报
  • 初中体育开展篮球教学的几点看法
  • 2015春沪教版语文四下哥伦布竖立鸡蛋word导学案【可编辑】
  • 小学教师座右铭
  • 小学二年级上册数学奥数知识点讲解第1课《速算与巧算》试题附答案【精校】.doc
  • 学*贯彻***总书记在纪念五四运动100周年大会上重要讲话精神心得体会06
  • 教师招聘考试最新面试答辩题
  • 以党的十五大精神为动力 加快广东商品流通体系建设
  • 沈阳市公光摩托车汽车配件经销部企业信息报告-天眼查
  • 六年级下册语文课件-第10课 螳螂捕蝉课后作业(a组)|苏教版 (共11张PPT)
  • 靖安县双溪镇双丰农作物病虫防治农民专业合作社企业信用报告-天眼查
  • 中西方公务员制度比较.精讲
  • 信号量---实现同步互斥
  • 2019-2020学年八年级语文上册 第一单元 4《就英法联军远征中国给巴特勒上尉的信》教案(新人教版).doc
  • 【优质文档】《读李白诗歌 品太白遗韵》教案-word范文 (3页)
  • 大学新生开学典礼主持演讲稿
  • 学*彭德怀元帅高尚情怀心得体会
  • 2018-2023年中国海鲜行业发展现状分析与投资前景预测研究-(目录)
  • 浅析大学辅导员工作对大学生心理健康教育的重要性
  • 2018年贵州公务员考试行测真题
  • 油田生产中电力系统的安全运行
  • 三年级除法脱式计算练*题100道
  • 最新 初中语文阅读教学中设疑提问的方法-精品
  • 关于post数据服务器端接收不全
  • 【推荐】2020九年级物理全册 19.1家庭电路练*(含解析)(新版)新人教版
  • 参观钟祥彭墩新农村建设体会精选多篇
  • 铜钱草怕晒太阳吗
  • 校园六一儿童节活动总结
  • 2011年贵州省中小企业发展专项资金项目申报
  • 吉林省伊通满族自治县第三中学校高中英语人教选修8Unit4 Pygmalion-Language points 课件
  • 小白写爬虫
  • 2016 2017年二年级语文上册教学计划人教版
  • 怎么把表格横向打印
  • 精选最新 三年级下册英语课件-Unit 1《Who’s this boy》|重大版(共22张PPT)
  • 【工程文档】钢结构安装焊接施工技术概况(doc 11页)
  • TD—SCDMA宽带非对称Doherty功放设计
  • 大连首轮机械工业有限公司(企业信用报告)- 天眼查
  • 2018-2019年白城市洮北区东胜乡中心小学一年级上册数学复习题无答案
  • 电脑版