java 线程联合
来源:互联网 发布:java单线程程序 编辑:程序博客网 时间:2024/05/19 01:09
一、需求
编写一个Java源程序,其中包含:
编写一个实现了Runnable接口的类,这个类中包含3个线程,3个线程的名字是“运货司机”,“装运工”,“仓库管理员”。要求线程“运货司机”占有CPU资源之后联合线程“装运工”,也就是让“运货司机”一直等到“装运工”完成工作才能开车。线程“装运工”占有CPU资源之后联合线程“仓库管理员”,也就是让“装运工”一直等到“仓库管理员”打开仓库才能开始搬运货物。
编写一个包含主方法main的公共类(访问权限为public的类),在主方法main中,使用第1步中的编写的类创建一个对象,使用这个对象调用线程“运货司机”,“装运工”和“仓库管理员”,并启动线程(start)。
二、知识点
用Runable创建线程:
1、定义一个实现Runable接口的类
2、在此类中重写Runable接口中的run方法(即:将线程运行的代码放入run方法中)
3、通过Thread类建立线程对象
4、将Runable接口的子类对象作为实际参数,传递给Thread类构造方法
5、调用Thread类的start方法开启线程
针对该需求的注意事项:
- 构造方法中,new Thread的时时候一定要加入this参数
原因:自定run方法所属的对象是Runable接口的子类对象,所以要让线程去执行指定对象的run方法,即要将Runable接口的子类对象传递给Thread的构造函数。
三、使用类
1、Thread类
Thread(Runnable target, String name)
传入一个实现了Runable接口的类以及一个字符串,分配新的 Thread 对象。该Thread对象的run方法为传入的Runable接口的类的run方法,线程的名字为传入的字符串。currentThread()
<静态方法> 返回CPU正在执行的线程的对象getName()
返回该线程的名称。sleep(long millis)
<静态方法> 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。start()
使该线程开始执行;Java 虚拟机调用该线程的 run 方法。interrupt()
中断线程。join()
等待该线程终止。
2、Runable接口
- run()
使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。
四、代码
class 运货 implements Runnable{ Thread 运货司机,装运工,仓库管理员; final int 货物数量 = 10; final int 仓库门数 = 5; public 运货() { 运货司机 = new Thread(this,"运货司机"); 装运工 = new Thread(this,"装运工"); 仓库管理员 = new Thread(this, "仓库管理员"); } public void run() { if("运货司机".equals(Thread.currentThread().getName())) { System.out.println(Thread.currentThread().getName()+"等待装运工装货"); try { 装运工.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"打开车锁"); System.out.println(Thread.currentThread().getName()+"把握方向盘"); System.out.println(Thread.currentThread().getName()+"挂档"); System.out.println(Thread.currentThread().getName()+"踩油门"); } if("装运工".equals(Thread.currentThread().getName())) { System.out.println(Thread.currentThread().getName()+"等待仓库管理员开门"); try { 仓库管理员.join(); } catch (InterruptedException e) { e.printStackTrace(); } for (int i = 1; i <= 货物数量; i++) { System.out.println(Thread.currentThread().getName()+"搬运第"+i+"箱货物到货车"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } if("仓库管理员".equals(Thread.currentThread().getName())) { for (int i = 1; i <= 仓库门数; i++) { System.out.println(Thread.currentThread().getName()+"打开第"+i+"道门"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } }}public class Main{ public static void main(String[] args) { 运货 沃尔玛 = new 运货(); 沃尔玛.仓库管理员.start(); 沃尔玛.装运工.start(); 沃尔玛.运货司机.start(); }}
五、运行截图
- java 线程联合
- java多线程之联合线程
- Java- 简单了解线程 线程创建和联合线程(一)
- java多线程学习三:联合线程
- 联合线程
- 联合线程 join()
- 5.2 后台线程与联合线程
- java注解联合主键
- 联合编译-java
- 线程扫盲之联合线程和后台线程
- 联合
- 联合
- 联合
- 联合
- 联合
- 联合
- 联合
- 并发容器ConcurrentHashMap与synchronized联合使用达到线程安全
- Spring Boot 引用本地jar包
- 搅动金融科技的人工智能,能否颠覆支付格局?
- 对对机如何连接美团,饿了么,百度外卖等自动接单(图文教程)
- 2017.11.4 (c)
- UE 实用技巧分享
- java 线程联合
- 基于网络爬虫的负面信息搜集系统
- 能与app竞争未来的小程序到底是什么?
- 8,数据挖掘环境搭建-IDEA MAVEN搭建Spark开发环境
- sublime text3在终端输出中文乱码
- JDK8中ArrayList源码分析
- TP5 模型
- 条款03:尽可能的使用const
- 判断APP是原生的还是H5页面