题目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. Windows PR提权

    目录 提权利用的漏洞 PR提权 提权利用的漏洞 Microsoft Windows RPCSS服务隔离本地权限提升漏洞 RPCSS服务没有正确地隔离 NetworkService 或 LocalSer ...

  2. wordpress如何隐藏后台位置?

    2017-02-08 20:43:20 言曌 阅读数 3585更多 分类专栏: WordPress 转载 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本 ...

  3. CTFHub-技能树-Bypass disable_function:LD_PRELOAD

    LD_PRELOAD 目录 LD_PRELOAD 题目描述 解题过程 简单测试 查看phpinfo 编译动态链接库 写调用代码 题目描述 目标:获取服务器上/flag文件中的 flag.需要了解 Li ...

  4. Cannot load driver class: com.mysql.jdbc.Driver

    mysql-connector-java提供了mysql驱动等类库,此处必须引入此依赖,否则将会提示: Cannot load driver class: com.mysql.jdbc.Driver等 ...

  5. The content of element type "web-app" must match "(icon?,display- name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet- mapping*,session-config?

    web.xml头部配置: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app P ...

  6. JVM什么叫安全检测点

    [deerhang] 在JVM的垃圾回收阶段,GC线程首先要进行对象的可达性分析.为了避免多线程对可达性分析的影响引出了安全点检测的概念 当GC线程进行GC前,需要等待其他线程进入安全点.例如JVM调 ...

  7. 关于Java处理串口二进制数据的问题 byte的范围 一个字节8bits

    前置知识点 byte的范围[-128~127] 内存里表现为 0x00~0xFF 刚好是一个8bits的字节 问题 byte[] hexData = new byte[] {0x01, 0x03, 0 ...

  8. Truncate用法详解

    前言: 当我们想要清空某张表时,往往会使用truncate语句.大多时候我们只关心能否满足需求,而不去想这类语句的使用场景及注意事项.本篇文章主要介绍truncate语句的使用方法及注意事项. 1.t ...

  9. C++ primer plus读书笔记——第11章 使用类

    第11章 使用类 1. 运算符重载是一种形式的C++多态. 2. 不要返回指向局部变量或临时对象的引用.函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据. 3. 运算符重载的格式如下: ...

  10. Java数组学习之前基础小案例

    不多说,1天时间看完数组之前内容,这就靠代码的实践总结一下吧~~ 打印三角形 简单易懂,初学都会,就不注释了,前者为取巧的三角形实现方法,我注释了,直接上源码~~ public class Trian ...