一.相关知识:
Java多线程程序设计到的知识:
(一)对同一个数量进行操作
(二)对同一个对象进行操作
(三)回调方法使用
(四)线程同步,死锁问题
(五)线程通信
等等
二.示例一:三个售票窗口同时出售20张票;
程序分析:1.票数要使用同一个静态值
2.为保证不会出现卖出同一个票数,要java多线程同步锁。
设计思路:1.创建一个站台类Station,继承Thread,重写run方法,在run方法里面执行售票操作!售票要使用同步锁:即有一个站台卖这张票时,其他站台要等这张票卖完!
2.创建主方法调用类
(一)创建一个站台类,继承Thread
package com.xykj.threadStation; public class Station extends Thread { // 通过构造方法给线程名字赋值 public Station(String name) { super(name);// 给线程名字赋值 } // 为了保持票数的一致,票数要静态 static int tick = 20; // 创建一个静态钥匙 static Object ob = "aa";//值是任意的 // 重写run方法,实现买票操作 @Override public 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(); } } } }
(二)创建主方法调用类
package com.xykj.threadStation; public class MainClass { /** * java多线程同步锁的使用 * 示例:三个售票窗口同时出售10张票 * */ public static void main(String[] args) { //实例化站台对象,并为每一个站台取名字 Station station1=new Station("窗口1"); Station station2=new Station("窗口2"); Station station3=new Station("窗口3"); // 让每一个站台对象各自开始工作 station1.start(); station2.start(); station3.start(); } }
程序运行结果:
窗口2卖出了第20张票 窗口3卖出了第19张票 窗口1卖出了第18张票 窗口2卖出了第17张票 窗口3卖出了第16张票 窗口1卖出了第15张票 窗口1卖出了第14张票 窗口2卖出了第13张票 窗口3卖出了第12张票 窗口2卖出了第11张票 窗口1卖出了第10张票 窗口3卖出了第9张票 窗口2卖出了第8张票 窗口3卖出了第7张票 窗口1卖出了第6张票 窗口2卖出了第5张票 窗口1卖出了第4张票 窗口3卖出了第3张票 窗口3卖出了第2张票 窗口1卖出了第1张票 票卖完了
可以看到票数是不会有错的!
三.示例二:两个人AB通过一个账户A在柜台取钱和B在ATM机取钱!
程序分析:钱的数量要设置成一个静态的变量。两个人要取的同一个对象值
(一)创建一个Bank类
/**两个人AB通过一个账户(2000元) * A在柜台取钱和 * B在ATM机取钱! * A一次取出100员,B一次取出200元,直到全部取出。 * Created by FXY on 2018/6/29. */ public class Bank { public static int money = 2000; public void withdrawMoney(int money , String equipment,String name) { synchronized (this) { //加锁同步 if (equipment.endsWith("counter")&& Bank.money>=money) { Bank.money -= money; System.out.println(name+"在" + equipment + "取走了" + money + "还剩下" + Bank.money); } if(equipment.endsWith("atm")&& Bank.money>=money){ Bank.money -= money; System.out.println(name+"在" + equipment + "取走了" + money + "还剩下" + Bank.money); } } } }
二)创建一个PersonA类
/** * Created by FXY on 2018/6/29. */ public class PersionA extends Thread{ Bank bank; // 通过构造器传入银行对象,确保两个人进入的是一个银行 public PersionA(Bank bank) { this.bank = bank; setName("counter");//给线程命名 } @Override public void run(){ while (Bank.money>=100){ bank.withdrawMoney(100,"counter",getName()); try { sleep(1000);// 取完休息1秒 } catch (InterruptedException e) { e.printStackTrace(); } } } }
(三)创建一个PersonB类
/** * Created by FXY on 2018/6/29. */ public class PersionB extends Thread{ Bank bank; // 通过构造器传入银行对象,确保两个人进入的是一个银行 public PersionB(Bank bank) { this.bank = bank; setName("atm"); } @Override public void run() { while(Bank.money>=200){ bank.withdrawMoney(200,"atm",getName()); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
(四)创建主方法的调用类
public class MainClass { /** * 两个人AB通过一个账户A在柜台取钱和B在ATM机取钱 * */ public static void main(String[] args) { // 实力化一个银行对象 Bank bank = new Bank(); // 实例化两个人,传入同一个银行的对象 PersonA pA = new PersonA(bank); PersonB pB = new PersonB(bank); // 两个人开始取钱 pA.start(); pB.start(); } }
运行结果:
counter在counter取走了100还剩下1900 atm在atm取走了200还剩下1700 counter在counter取走了100还剩下1600 atm在atm取走了200还剩下1400 counter在counter取走了100还剩下1300 atm在atm取走了200还剩下1100 atm在atm取走了200还剩下900 counter在counter取走了100还剩下800 atm在atm取走了200还剩下600 counter在counter取走了100还剩下500 counter在counter取走了100还剩下400 atm在atm取走了200还剩下200 atm在atm取走了200还剩下0
可以看到取完就停止运行了。
今天就写了这俩例子,只要理解了,其他的就简单了!!!!!!
还有好几种例子,引用自此处
https://blog.csdn.net/wenzhi20102321/article/details/52524545
相关推荐
### Java多线程小例子详解 #### 知识点一:基本多线程示例 在给定的代码示例中,我们首先看到的是一个简单的Java多线程应用实例。这个例子展示了如何创建并启动一个新的线程。在`ThreadDemo`类的`main`方法中,...
根据提供的文件信息,我们可以归纳出以下关于Java多线程的经典示例中的关键知识点: ### Java多线程实现方式 在Java中,实现多线程有两种主要的方法:通过继承`Thread`类或者实现`Runnable`接口。 #### 继承...
在Java编程语言中,线程是程序执行的基本单元,它允许程序同时执行多个任务。Java中的线程模型是建立在操作系统级别的线程之上的,因此,通过Java的线程机制,开发者可以充分利用多核处理器的资源,提高程序的并发性...
《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...
在本文中,我们将深入探讨Java多线程的基本概念,并通过一个简单的实例来理解其工作原理。 首先,我们需要了解Java中的线程是如何创建的。在Java中,有三种主要的方式来创建线程: 1. **实现Runnable接口**:这是...
### Java多线程的使用与介绍 #### 什么是多线程? 多线程是指程序能够同时执行多个线程的能力。每个线程都是一个轻量级的进程,可以在单个程序中独立运行,共享该程序的资源。在Java中,多线程是通过`java.lang....
总之,Java多线程技术是软件开发中的重要技能,它涉及到线程池的使用、线程同步和通信等多个方面。通过学习和理解`MaxThreadCountTest`中的例子,开发者可以更好地掌握如何在实际项目中控制线程数量,优化程序性能,...
最后,死锁是多线程编程中的常见问题,两个或更多线程相互等待对方释放资源导致无法继续执行。为了避免死锁,我们需要遵循四个条件的至少一个:互斥、请求与保持、不剥夺和循环等待。Java提供了一些工具如jstack和...
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关...第五章 Java线程编程的例子 第六章 Java线程调度 第七章 Java线程调度例子 第八章 和同步相关的高级主题 第九章 多处理器机器上的并行化 第十章 线程组
在“java多线程模拟队列实现排队叫号”这一主题中,我们将深入探讨如何利用这两种技术来模拟现实生活中常见的排队叫号系统。 首先,多线程是指一个程序中可以同时执行多个独立的执行流,每个执行流被称为一个线程。...
下面介绍几种常见的Java多线程设计模式及其应用场景: 1. **生产者-消费者模式**: - 这是一种经典的多线程模型,用于解决多线程之间的通信问题。 - 生产者负责生成数据,消费者负责消费这些数据。 - 使用队列...
Java中的线程优先级是Java多线程编程中一个重要的概念,它用于控制不同线程的执行顺序。线程优先级允许我们为某些任务分配更高的执行权重,理论上高优先级的线程会比低优先级的线程更早获得CPU执行时间。然而,需要...
### JAVA多线程编程详解-详细操作例子 #### 一、理解多线程 多线程是一种编程模型,它允许程序中的多个指令流同时运行,每个指令流即为一个线程,它们彼此独立但共享同一进程资源。这种机制极大地提高了程序的并发...
标题"多线程经典例子"暗示我们将讨论一些多线程编程中的常见示例。以下是一些经典的应用场景: 1. **下载任务**:当需要从网络下载大文件时,可以创建多个线程分别负责不同部分的下载,这样可以显著加快下载速度。 ...
在IT领域,多线程编程是一种常见的技术,用于提高程序的执行效率,特别是在需要执行并发任务时。这个例子,"一个多线程ping的例子",显然旨在演示如何利用多线程来同时ping多个IP地址,以检查它们的网络可达性。在...
在Java编程中,多线程环境下的中文乱码问题是一个常见的困扰。这通常是由于编码设置不一致或处理不当导致的。下面将详细解释这个问题的原因、影响以及如何解决。 首先,我们要理解字符编码的基础知识。在计算机中,...
在这个例子中,我们看到一个简单的Java多线程程序,用于模拟售票系统,其中有两个类`SellThread`和`AddThread`分别代表售票和加票的操作。 首先,我们来理解一下`SellThread`类。这个类实现了`Runnable`接口,这...