java多线程的常见例子

一.相关知识:

Java多线程程序设计到的知识:

(一)对同一个数量进行操作

(二)对同一个对象进行操作

(三)回调方法使用

(四)线程同步,死锁问题

(五)线程通信

等等

二.示例一:三个售票窗口同时出售20张票;

程序分析:1.票数要使用同一个静态值

2.为保证不会出现卖出同一个票数,要java多线程同步锁。

设计思路:1.创建一个站台类Station,继承Thread,重写run方法,在run方法里面执行售票操作!售票要使用同步锁:即有一个站台卖这张票时,其他站台要等这张票卖完!

2.创建主方法调用类

(一)创建一个站台类,继承Thread

package com.com.shundong.thread;/*** @ClassName Station* @Description 三个售票窗口同时出售20张票* @Author shundong* @Date 2018/12/8 12:31 AM* @Version 1.0**/
public class Station extends Thread {// 通过构造方法给线程名字赋值public Station(String name) {super(name);// 给线程名字赋值}// 为了保持票数的一致,票数要静态static int tick = 20;// 创建一个静态钥匙static Object ob = "test";//值是任意的// 重写run方法,实现买票操作@Overridepublic void run() {while (tick > 0) {synchronized (ob) {// 这个很重要,必须使用一个锁,// 进去的人会把钥匙拿在手上,出来后才把钥匙拿让出来if (tick > 0) {System.out.println(getName() + "卖出了第" + tick-- + "张票");//tick--;} else {System.out.println("票卖完了");}}try {sleep(1000);//休息一秒} catch (InterruptedException e) {e.printStackTrace();}}}// for testpublic static void main(String[] args) {Station station1 = new Station("站台一");Station station2 = new Station("站台二");Station station3 = new Station("站台仨");station1.start();station2.start();station3.start();}
}

程序运行结果:  

可以看到票数是不会有错的!

三.示例二:两个人AB通过一个账户A在柜台取钱和B在ATM机取钱!

程序分析:钱的数量要设置成一个静态的变量。两个人要取的同一个对象值。 取钱的方法一定要同步

(一)创建一个Bank类

package com.shundong.day1;/*** @ClassName Bank* @Description 银行 内置柜台 和 ATM 两张方式取钱* @Author shundong* @Date 2018/12/8 7:31 PM* @Version 1.0**/
public class Bank {// 假设一个账户有1000块钱static int money = 1000;// 柜台Counter取钱的方法public synchronized void Counter(int money) {// 参数是每次取走的钱Bank.money -= money;//取钱后总数减少System.out.println("A取走了" + money + "还剩下" + (Bank.money));}// ATM取钱的方法public synchronized void ATM(int money) {// 参数是每次取走的钱Bank.money -= money;//取钱后总数减少System.out.println("B取走了" + money + "还剩下" + (Bank.money));}}

(二)创建一个PersonA类

package com.shundong.day1;/*** @ClassName PersonA* @Description 用户A 在柜台取钱 每次 100 * @Author shundong* @Date 2018/12/8 7:31 PM* @Version 1.0**/
public class PersonA extends Thread{//创建一个银行对象Bank bank;// 通过构造器传入银行对象,确保两个人进入的是一个银行public PersonA(Bank bank) {this.bank = bank;}//重写run方法,在里面实现使用柜台取钱@Overridepublic void run() {while (Bank.money >= 100) {bank.Counter(100);// 每次取100块try {sleep(100);// 取完休息0.1秒} catch (InterruptedException e) {e.printStackTrace();}}}}

(三)创建一个PersonB类

package com.shundong.day1;/*** @ClassName PersonB* @Description 用户B 在ATM 取款 每次200* @Author shundong* @Date 2018/12/8 7:33 PM* @Version 1.0**/
public class PersonB extends Thread {// 创建银行对象Bank bank;// 通过构造器传入银行对象,确保两个人进入的是一个银行public PersonB(Bank bank) {this.bank = bank;}// 重写run方法,在里面实现使用柜台取钱@Overridepublic void run() {while (Bank.money >= 200) {bank.ATM(200);// 每次取200块try {sleep(100);// 取完休息0.1秒} catch (InterruptedException e) {e.printStackTrace();}}}}

(四)创建一个MainClass类 测试

package com.shundong.day1;/*** @ClassName MainClass* @Description 两个人AB通过一个账户A在柜台取钱和B在ATM机取钱* @Author shundong* @Date 2018/12/8 7:35 PM* @Version 1.0**/
public class MainClass {//for testpublic static void main(String[] args) {Bank bank = new Bank();PersonA personA = new PersonA(bank);PersonB personB = new PersonB(bank);personA.start();personB.start();}
}

  运行MainClass类 结果:

四.示例三:龟兔赛跑问题

龟兔赛跑:20米     //只要为了看到效果,所有距离缩短了

要求:

1.兔子每秒0.5米的速度,每跑2米休息10秒,

2.乌龟每秒跑0.1米,不休息

3.其中一个跑到终点后另一个不跑了!

程序设计思路:

1.创建一个Animal动物类,继承Thread,编写一个running抽象方法,重写run方法,把running方法在run方法里面调用。

2.创建Rabbit兔子类和Tortoise乌龟类,继承动物类

3.两个子类重写running方法

4.本题的第3个要求涉及到线程回调。需要在动物类创建一个回调接口,创建一个回调对象

(一)创建Animal动物类

package com.shundong.dya2;/*** @ClassName Animal* @Description 抽象类 动物* @Author shundong* @Date 2018/12/8 7:53 PM* @Version 1.0**/
public abstract class Animal extends Thread {//赛道长度public double length = 20.00;//抽象的 runing 子类只需要重写 该方法即可public abstract void runing();//父类重写的 run 只需要调用 runing即可@Overridepublic void run() {super.run();while (length > 0) {runing();}}//在需要回调数据的地方(两个子类需要),声明一个接口public static interface Calltoback {public void win();}//2.创建接口对象public Calltoback calltoback;
}

(二)创建Rabbit兔子类

package com.shundong.dya2;/*** @ClassName Rabbit* @Description 兔子的类 兔子每秒0.5米的速度,每跑2米休息10秒,* @Author shundong* @Date 2018/12/8 8:01 PM* @Version 1.0**/
public class Rabbit extends Animal {//构造器为 此线程取名public Rabbit() {setName("兔子");}//重写 父类 动物类的 runing的 方法@Overridepublic void runing() {// 跑的距离double dis = 0.5;length -= dis;//跑完后距离减少if (length <= 0) {length = 0;System.out.println("兔子获得了胜利");//给回调对象赋值,让乌龟不要再跑了if (calltoback != null) {calltoback.win();}}System.out.println("兔子跑了" + dis + "米,距离终点还有" + (int) length + "米");if (length % 2 == 0) {// 两米休息一次 时间为 1s  10s太长了 该处为了 方便测试try {sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

(三)创建Tortoise乌龟类

package com.shundong.dya2;/*** @ClassName Tortoise* @Description 乌龟类* @Author shundong* @Date 2018/12/8 8:05 PM* @Version 1.0**/
public class Tortoise extends Animal {// Thread的方法,给线程赋值名字public Tortoise() {setName("乌龟");}// 重写running方法,编写乌龟的奔跑操作@Overridepublic void runing() {// 跑的距离double dis = 0.1;length -= dis;if (length <= 0) {length = 0;System.out.println("乌龟获得了胜利");// 让兔子不要在跑了 回调函数if (calltoback != null) {calltoback.win();}}System.out.println("乌龟跑了" + dis + "米,距离终点还有" + (int) length + "米");try {sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}
}

(四)创建一个让动物线程停止的类,这里要实现回调接口

package com.shundong.dya2;/*** @ClassName LetOneStop* @Description 处理回调函数* @Author shundong* @Date 2018/12/8 8:09 PM* @Version 1.0**/
public class LetOneStop implements Animal.Calltoback {//动物对象Animal animal;//传过来的 参数 不是乌龟就是兔子public LetOneStop(Animal animal) {this.animal = animal;}//让线程停止的回调函数@Overridepublic void win() {//停止线程animal.stop();}
}

(五)创建一个主方法调用类,

package com.shundong.dya2;/*** @ClassName MainClass* @Description 龟兔赛跑:20米    测试* @Author shundong* @Date 2018/12/8 8:12 PM* @Version 1.0**/
public class MainClass {//for testpublic static void main(String[] args) {//实例化乌龟和兔子Tortoise tortoise = new Tortoise();Rabbit rabbit = new Rabbit();//回调方法的使用,谁先调用calltoback方法,另一个就不跑了LetOneStop letOneStop1 = new LetOneStop(tortoise);rabbit.calltoback = letOneStop1;//让兔子的回调方法里面存在乌龟对象的值,可以把乌龟stopLetOneStop letOneStop2 = new LetOneStop(rabbit);tortoise.calltoback = letOneStop2;//让乌龟的回调方法里面存在兔子对象的值,可以把兔子stop//开始跑tortoise.start();rabbit.start();}
}

  运行MainClass类 结果:

待续。。。。

转载于:https://www.cnblogs.com/shundong106/p/10086340.html

Java多线程_复习(更新中!!)相关推荐

  1. java 多线程写缓存,Java多线程_缓存对齐

    1.什么是缓存对齐 当前的电脑中,数据存储在磁盘上,可以断电保存,但是读取效率较低.不断电的情况下,数据可以在内存中存储,相对硬盘效率差不多是磁盘的一万倍左右.但是运算时,速度最快的是直接缓存在CPU ...

  2. Java_Web笔记汇总_火热更新中。。。

    零.历史和特点 1.历史 (1)作者:James-Gosling (2)主要发展历程 1995.5.23SUN公司 正式发布了Java语言 1996年1月 开发工具包JDK1.0 1997年2月 JD ...

  3. java多线程 线程安全_Java中的线程安全

    java多线程 线程安全 Thread Safety in Java is a very important topic. Java provides multi-threaded environme ...

  4. JAVA面试大全(持续更新中...)

    本文旨在收集Java面试过程中出现的问题,力求全面,仅作学习交流,欢迎补充,持续更新中-,部分段落选取自网上,部分引用文章已标注,部分已记不清了,如侵权,联系本人 Java基础 1.面向对象的概述 面 ...

  5. Java面试-2021Gaoven-持续更新中

    Java面试 一.基础 1.&&和&的区别? |和||的区别? 1.当符号左边是false时,&继续执行符号右边的运算.&&不再执行符号右边的运算. 2 ...

  6. acm竞赛java很少,Java多线程在ACM竞赛中的应用

    欢迎转载,转载请注明出处. 转发注记:网上看到有少数人讨论过在ACM竞赛中使用多线程,但是在Online Judge上一般是不支持的.因为Online Judge都会限制CPU的使用权限,所以即使可以 ...

  7. 修改docker内java内存_在docker中使用java的内存情况

    Java和Docker不是天然的朋友. Docker可以设置内存和CPU限制,而Java不能自动检测到.使用Java的Xmx标识(繁琐/重复)或新的实验性JVM标识,我们可以解决这个问题. 虚拟化中的 ...

  8. java 企业版_下列版本中哪个是Java 企业版

    下列版本中哪个是Java 企业版 2021-02-07 下列版本中哪个是Java 企业版 张爱玲评价自己的服饰:"仿佛穿着博物院的()到处走,遍体森森然飘飘欲仙".转动惯量是刚体转 ...

  9. wxpython 多线程_在wxPython中使用线程连续更新GUI的好方法?

    我正在开发一个使用pythonv2.7和wxpythonv3.0的GUI应用程序. 我必须不断更新我的图形用户界面,其中包含许多面板.每个面板包含一个wx.StaticText.我必须不断更新这些wx ...

最新文章

  1. AI玩微信跳一跳的正确姿势:一不小心就超越了最高分,瞬间称霸了朋友圈~
  2. mybatis入门配置——基于xml配置
  3. python sendto函数返回值_有返回值的函数amp;闭包(python)
  4. Codeforces Round #654 (Div. 2)
  5. modelsim 的高效使用
  6. 汇编:用户登录以及简单数据加密
  7. c make干什么用得_CMake简单使用
  8. H265播放器EasyPlayer测试demo停顿后实现自动重连的优化分享
  9. 从随机森林到极端随机森林,再到深度森林
  10. 股票数据Scrapy爬虫-Python网络爬虫与信息提取-北京理工大学嵩天教授
  11. Linux 系统下实践 VLAN
  12. 重试利器Guava Retrying
  13. vue2.0 唤起百度地图app_高德地图公测“你好小德”语音助手:解决十大驾车导航痛点...
  14. VSCode自定义网络背景皮肤
  15. for(int i:nums){.....}的含义
  16. python实现小程序_python实现小程序
  17. 正则表达式re库 python3
  18. 拍照基础方法及构图技巧
  19. 雷达成像原理(一)合成孔径成像Chirp-Scaling
  20. php小偷程序--获取网站内容

热门文章

  1. 重命名master分支
  2. 怎么把计算机模式重置,电脑怎么还原出厂模式
  3. 华为交换机一次性进入多个接口_华为交换机交换机常用配置(认证、批量操作)...
  4. 4k*1芯片 计算机组成,计算机组成原理的大神们能不能帮忙做几道题啊
  5. 20210503:力扣第239周周赛题解
  6. android用sax解析xml,详解android使用SAX解析XML文件
  7. 公众号回复单个图文消息
  8. sunplus8202v 无线游戏手柄——续
  9. MCU加密技术分析(二)
  10. 四大浏览器再战Windows平台:Opera勇夺第一