题目1

编写程序,创建两个线程对象,一根线程循环输出“播放背景音乐”,另一根线程循环输出“显示画面”;
要求:

1: 1个线程使用Runnable接口的匿名内部类实现

2: 另一个线程使用lambda实现

效果:

参考答案:

public static void main(String[] args) {
//匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
while (true){
System.out.println("播放背景音乐...");
}
}
}).start();
//lambda
new Thread(()->{
while (true){
System.out.println("显示画面...");
}
}).start();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

题目2

3.请使用继承Thread类的方式定义一个线程类,在run()方法中循环10次,每1秒循环1次,每次循环按“yyyy-MM-dd HH:mm:ss”的格式打印当前系统时间。
请定义测试类,并定义main()方法,启动此线程,观察控制台打印。

要求:

1: 使用匿名内部类配合SimpleDateFormat和Date实现

2: 使用lambda配合LocalDateTime和DateTimeFormatter实现

效果:

参考答案:

//方式1:
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
new Thread(){
@Override
public void run() {
for (int i = 0; i < 10; i++) {
String format = sdf.format(new Date());
System.out.println(format);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
//方式2:
public static void main(String[] args) {
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
new Thread(()->{
for (int i = 0; i < 10; i++) {
String format = f.format(LocalDateTime.now());
System.out.println(format);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

题目3

请编写多线程应用程序,模拟多个人通过一个山洞:
(1).这个山洞每次只能通过一个人,每个人通过山洞的时间为1秒;
(2).创建10个线程,同时准备过此山洞,并且定义一个变量用于记录通过隧道的人数。显示每次通过山洞人的姓名,和通过顺序;

要求:

保证安全问题,不能出现多个人同时通过山洞的现象;(必须逐一通过)

效果:

参考答案:

public class A {
public static void main(String[] args) {
MyRunnable mr = new MyRunnable();
for (int i = 0; i < 10; i++) {
new Thread(mr,"线程"+i).start();
} } }
class MyRunnable implements Runnable {
private int count = 1;
public void run() {
synchronized (this) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"通过山洞,他是第"+count+"个");
count++;
}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

题目4

拼手速抽奖案例.

1.现有一个集合装了10个奖品在里面,分别是:{“电视机”,“电冰箱”,“电脑”,“游戏机”,“洗衣机”,“空调”,“手机”,“平板电脑”,“电动车”,“电饭煲”};

2.假如有3个人同时去抽这10个奖品.最后打印出来.三个人各自都抽到了什么奖品.

例如:

张三: “电视机”,”电冰箱”,”电脑”,”游戏机”,”洗衣机”

李四: ”空调”,”手机”,”平板电脑”,

王五: ”电动车”,”电饭煲

要求:

1:3个人同时开始抽奖,每次抽奖需要使用0.5秒才能完成抽奖;

2:需要控制住同一个奖项不能同时被多个人抽走;

效果:

参考答案:

public class A {
public static void main(String[] args) {
//创建抽奖任务类对象
MyRunnable mr = new MyRunnable();
//创建3个线程对象,都关联着任务对象,
Thread t1 = new Thread(mr,"张三");
Thread t2 = new Thread(mr,"李四");
Thread t3 = new Thread(mr,"王五");
//开始抽奖
t1.start();
t2.start();
t3.start();
} }
class MyRunnable implements Runnable {
private static ArrayList<String> list = new ArrayList<>();
static {
//初始化奖品,而且,只能初始化1次,所以使用了静态代码块
Collections.addAll(list,"电视机","电冰箱","电脑","游戏机","洗衣机","空调","手机","平板电脑","电动车","电饭煲");
}
public void run() {
while (list.size()>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
if(list.size()==0){
return;//加这个if是确保安全的
}
String r = list.remove(new Random().nextInt(list.size()));
System.out.println(Thread.currentThread().getName()+"抽到了:"+r);
}
}
}
}

原文章:https://blog.csdn.net/qq_45181415/article/details/112107303

笔记-13-多线程 Thread方法 线程安全 生产者和消费者 死锁和阻塞 练习的更多相关文章

  1. 强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods)

    强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods) 学习笔记: Reinforcement Learning: An Introduction, Richa ...

  2. 17、多线程 (Thread、线程创建、线程池)

    进程概念 *A:进程概念 *a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程的概念 *A:线程的概念 *a ...

  3. java线程中生产者与消费者的问题

    一.概念 生产者与消费者问题是一个金典的多线程协作的问题.生产者负责生产产品,并将产品存放到仓库:消费者从仓库中获取产品并消费.当仓库满时,生产者必须停止生产,直到仓库有位置存放产品:当仓库空时,消费 ...

  4. Python-多线程及生产者与消费者

    一.前置知识 1. 队列基础 如果不指定队列是什么,请自行查阅 在Python中,队列是最常用的线程间的通信方法,因为它是线程安全的 from queue import Queue # 创建队列 # ...

  5. C#多线程实现方法——线程池(Thread Pool)

    ThreadPool使用 同步机制   ThreadPool使用 需要定义waitcallback委托形式如 public delegate void WaitCallback(object stat ...

  6. java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)

    在真实开发 中关于多线程的通讯的问题用到下边的例子是比较多的 不同的地方时if 和while 的区别 如果只是两个线程之间的通讯,使用if是没有问题的. 但是在多个线程之间就会有问题 /* * 这个例 ...

  7. java 22 - 13 多线程之解决线程安全问题的实现方式2

    上一章说了,解决线程安全问题的实现方式1是使用同步代码块 同时也知道了,同步代码块的锁对象是任意对象:(Object obj ;  Demo d;)这些都行 那么,现在来说解决线程安全问题的实现方式2 ...

  8. 多线程Thread,线程池ThreadPool

    首先我们先增加一个公用方法DoSomethingLong(string name),这个方法下面的举例中都有可能用到 #region Private Method /// <summary> ...

  9. JAVA多线程经典范列:生产者与消费者

    * 第一:生产者 生产的消费品 存放到仓库中,当仓库满时,生产者停止生产 * 第二:消费者 到仓库中 使用消费品,当仓库没有消费品时,停止消费 * 第三:生产者 在仓库满停止生产后 通知消费者去消费 ...

随机推荐

  1. 【js】Leetcode每日一题-完成所有工作的最短时间

    [js]Leetcode每日一题-完成所有工作的最短时间 [题目描述] 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工 ...

  2. 【vue-02】基础语法

    插值操作 插值运算符 语法:{{数据}} 插值运算符可以对数据进行显示{{msg}},也可以在插值运算符中进行表达式计算{{cnt*2}}. v-html 希望以html格式进行输出 htmlData ...

  3. SpringBoot 项目 部署 jar方式

    SpringBoot部署-jar方式 步骤1部署方式 Springboot 和我们之前学习的web 应用程序不一样,其本质上是一个 Java 应用程序,那么又如何部署呢?  通常来说,Springbo ...

  4. svn客户端访问失败,错误“请求的名称有效,但是找不到请求的类型”的解决

    1.问题描述:visualSVN客户端在其他机子访问出现以下问题(服务端装在我的电脑上,我本机客户端可以正常访问) 2. 原因分析:SVN客户端访问服务器需要输入URL地址,URL地址分为两种方式.一 ...

  5. js--吐血总结最近遇到的变态表单校验---element+原生+jq+easyUI(前端职业生涯见过的最烦的校验)

    最近写了无数各种形式的表单,记录下奇奇怪怪的校验规则~ 一:首先是element自带的rules校验规则: element作为常用框架,自带rules属性简单易懂,官方文档一目了然,不再赘述,应付常用 ...

  6. Canal详细入门实战(使用总结)

    Canal介绍 Canal简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在 ...

  7. [c++] 分号的使用

    加分号的情况: 语句结束加分号(否则编译器不知道在哪里结束语句,编译器不识别换行,写代码时换行和退格只是为了看着舒服,但本质上代码是写给编译器看的) 声明语句后加分号(也是一种语句) 结构体.类定义后 ...

  8. [Java] HOW2J(Java中级)

    异常 定义:导致程序正常流程被中断的事件 异常处理常见手段 try catch:将可能抛出异常的代码放在try的块中,一旦出现异常就跳转到catch的块中处理 throws/throw:不在本模块处理 ...

  9. CentOS 7 设置日期和时间 timedatectl

    CentOS 7 设置日期和时间 在CentOS 6版本,时间设置有date.hwclock命令,从CentOS 7开始,使用了一个新的命令timedatectl. timedatectl [root ...

  10. make: g77: Command not found 修改Makefile.in中的编译文件中的g77为gfortran

    make: g77: Command not found 编译cblas时报错,这时,修改Makefile.in中的编译文件中的g77为gfortran