java多线程对Runnable和Thread的理解及简述,内附实例。
启动线程的两个步骤:
1.实现Runnable这个接口,并实现这个接口中的run()方法。
2.实例化一个Thread对象并把实现了Runnable的对象传入Thread的构造参数中。
对Runnable和Thread的初步理解:
实现了接口Runnable中的run方法的对象就像是一份被指定的工作。而Thread就像是一个等待接收工作的工人。因此把实现了接口Runnable中的run方法的对象传入Thread()时就相当于给一个工人指定了工作。而这个被指定了工作的工人也就相当于一份可执行的线程。
以下列排队买票为例:
题目:模拟三个人排队买票,张某、李某和赵某买电影票,售票员只有三张五元的钱,电影票5元钱一张。张某拿二十元一张的新人民币排在李的前面买票,李某排在赵的前面拿一张10元的人民币买票,赵某拿一张五元的人民币买票。
简单思路:售票员为一个对象,负责找零和通知顾客排队。三个顾客各为一个对象,负责携带个人信息向售票员买票。其中要注意的是售票员对象只有一个(因为三个顾客均向该售票员买票),因此要实例化一个售票员对象并传入buyTickets()。(如果三个顾客均向不同的售票员对象买票结果可想而知。大伙可以动手尝试)
package a0315_3;//下列中有三个类 ,分别是ex测试类, buyTickets, TicketSeller
public class ex {public static void main(String args[]) {TicketSeller seller = new TicketSeller();buyTickets buy_z = new buyTickets("张 ", 20, seller); // buyTickets是实现了run方法的类,见代码第38行buyTickets buy_l = new buyTickets("李 ", 10, seller);buyTickets buy_w = new buyTickets("王 ", 5, seller);Thread thread_z = new Thread(buy_z); // 三位工人分别接手工作Thread thread_l = new Thread(buy_l);Thread thread_w = new Thread(buy_w);thread_z.setName("张 ");thread_l.setName("李 ");thread_w.setName("王 ");thread_z.start(); // 线程按顺序开始,(模拟排队)int count = 0;while (count < 1000000) { //世界上最原始的方法count++;}thread_l.start(); count = 0;while (count < 1000000) {count++;}thread_w.start();}
}class buyTickets implements Runnable { // 买票这个工作String name;int money;TicketSeller seller;buyTickets(String name1, int money1, TicketSeller seller1) {name = name1;money = money1;seller = seller1;}public void run() {System.out.println(name + "开始进行买票");seller.sellTicket(money); //携带钱去买票}}class TicketSeller // 负责卖票的类。(售票员类)
{int fiveMoney = 3, tenMoney = 0, twentyMoney = 0;public synchronized void sellTicket(int receiveMoney) {if (receiveMoney == 5) { // 张 有五块直接走fiveMoney = fiveMoney + 1;System.out.println(Thread.currentThread().getName() + "给我5元钱,不找钱");System.out.println(Thread.currentThread().getName() + "离开队列");} else if (receiveMoney == 10) { // 李while (fiveMoney < 1) { // 柜台没有五块零钱 就靠边等(循环)try {System.out.println(Thread.currentThread().getName() + "靠边等待!下一个先来");wait();System.out.println(Thread.currentThread().getName() + "结束等待");} catch (InterruptedException e) {}}fiveMoney = fiveMoney - 1;tenMoney = tenMoney + 1;System.out.println(Thread.currentThread().getName() + "给10元钱,找5元");System.out.println(Thread.currentThread().getName() + "离开队列");}else if (receiveMoney == 20) { // 赵 (柜台没有一张五块一张十块)又没有 (三张五块)就靠边等(循环)while ((fiveMoney < 1 || tenMoney < 1) && fiveMoney < 3) {try {System.out.println(Thread.currentThread().getName() + "靠边等待!下一个先来");wait();System.out.println(Thread.currentThread().getName() + "结束等待");} catch (InterruptedException e) {}}if (fiveMoney < 3) {fiveMoney = fiveMoney - 1;tenMoney = tenMoney - 1;twentyMoney = twentyMoney + 1;System.out.println(Thread.currentThread().getName() + "给20元钱,找一张5元和一张10元");}else if (fiveMoney < 1 || tenMoney < 1) {fiveMoney = fiveMoney - 3;twentyMoney = twentyMoney + 1;System.out.println(Thread.currentThread().getName() + "给20元钱,找三张5元");}System.out.println(Thread.currentThread().getName() + "离开队列");}notifyAll(); // 通知等待中的线程System.out.println("下一个!下一个!!!");}
}
运行结果 :
如果对你有所帮助,给个三连+关注吧~
java多线程对Runnable和Thread的理解及简述,内附实例。相关推荐
- python线程创建对象_Python线程下thread对象的用法介绍(附实例)
本篇文章给大家带来的内容是关于Python线程下thread对象的用法介绍(附实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Thread对象 Thread类用于表示单独的控制 ...
- Java多线程-线程的创建(Thread类的基本使用)
文章目录 一. 线程和Thread类 1. 线程和Thread类 1.1 Thread类的构造方法 1.2 启用线程的相关方法 2. 创建第一个Java多线程程序 3. 使用Runnable对象创建线 ...
- Java多线程的实现方式-Thread 类,Runnable 接口
在 Java 的 JDK 开发包中,已经自带了对多线程技术的支持,可以方便地进行多线程编程.实现多线程编程的方式主要有两种:一种是继承 Thread 类,另一种是实现 Runnable 接口.下面详细 ...
- Java多线程(2)--Thread类继承和Runnable接口创建线程
Java语言的JVM允许程序运行多个线程,它通过java.lang.Thread类来体现. Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run() ...
- 【转】java线程系列---Runnable和Thread的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
- java多线程中 锁 的概念的理解,java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)...
目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...
- Java 多线程 之 Runnable
转载于 : http://www.verejava.com/?id=16992909097867 package com.thread;/**注意:1. 如果要启动一个线程必须调用,start()方法 ...
- Java多线程基础学习,Thread解读、java线程的状态、同步和异步、两阶段终止模式
理论概述 单线程和多线程 为什么要使用多线程呢?多线程有什么好处呢? 如果在程序中,需要读写一个文件,该文件很大,那我们执行到该io操作时,cpu就会等待该io操作执行完才会继续运行下面的代码,进程调 ...
- java线程如何继承,java多线程(一)之继承Thread类
一.概述 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 二.两种实现方式, 下面为第一种方式: 继承Thread类 ...
- Java多线程(6)——Thread类中的一些方法(传智播客毕老师视频讲解)
1.守护线程 代码如下: import java.util.concurrent.locks.*; public class StopTest implements Runnable {private ...
最新文章
- c++11 模板的别名
- 数据挖掘实验报告-决策树程序实验
- DNN Experience
- 怎样用git获取指定的android linux kernel
- net use 使用
- js中的同步与异步的理解
- 5.6 深度卷积神经网络(AlexNet)
- FineReport程序网络报表 - Hello,World
- python span 抓取_python – Beautifulsoup获取span内容
- Property 'typeAliasesPackage' threw exception; nested exception is java.lang.ExceptionInInitializer
- 【经典】对static关键字深入理解
- linux 运维工程师必备技能
- Alibaba Cloud Toolkit —— 项目一键部署工具
- CMD控制台(命令提示符)的打开方式
- PyQt5 密码输入框
- 铝电解电容器在电路设计时的使用注意事项
- opencv图像处理学习(十五)——minMaxLoc函数
- 单片机与PC机串口通信编程
- 漂浮广告是什么?漂浮广告如何设置
- python爬虫什么书好_python爬虫什么书