我是靠谱客的博主 害怕皮皮虾,最近开发中收集的这篇文章主要介绍多线程解决窗口售票问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

   如果用过迅雷的人,就会发现,迅雷的速度比普通的下载器下载速度要快。是它有单用的网速通道吗?当然不是,这是因为迅雷开启了多线程,加快了下载速度。

   什么是进程?

   进程就是正在运行的程序。开启QQ就是开启了一个进程,当一个进程进入内存运行,就变成了一个进程。进程是处于运行过程中的程序。

   什么是线程?

   线程是进程中的一个执行单元,一个进程可以有多个线程。360安全卫士,在开启病毒查杀的同时也可以开启垃圾清理,一个程序开启多个任务,也就是开启多个线程的表现。

   以前我们的CPU是单核的,线程不能同时进行,只能运行一个线程。所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。CPU会在各个进程之间高度切换。现在CPU有二核四核的,这样就可以有多个线程同时进程。所以我们再看手机或电脑的时候,我们往往会关注是几核的,多核的运行速度会比较快。

   创建线程的目的:

   是为了建立程序单独执行的路径,让多部分代码实现同时执行。也就是说线程的创建并执行需要给定线程要执行的任务。

多线程定义方式:   

     1、定义类实现Runnable接口。
     2、覆盖接口中的run方法。。
     3、创建Thread类的对象
     4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数。
     5、调用Thread类的start方法开启线程。

这种方式去实现线程是比较好的,还有一种是继承Thread类

     1 定义一个类继承Thread。
     2 重写run方法。
     3 创建子类对象,就是创建线程对象。
     4 调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法。

    需求:电影院卖票,我们用多线程模拟电影院的卖票过程。假设有两个窗口正在售票编号为01-100,窗口一和窗口二正在卖票,本次电影的座位共100个(本场电影只能卖100张票)编号为01-100,现在实现:1、两个窗口卖票 2.计算两个窗口各自卖了多少张票,各自卖的票的编号3.实现两个窗口轮流卖票

   

public static void main(String[] args) {
//有100张票 编号为01-100
List<String> li=new ArrayList<String>();
for (int i = 1; i <=100; i++) {
if(i<10){
String s="0"+i;
li.add(s);
}else{
li.add(i+"");
}
}
// tickets t=new tickets();
//创建两个Thread类对象,传递Runnable接口实现类
tickets t=new tickets(li);
//3.创建实现类对象
Thread t0 = new Thread(t,"窗口一");
//4.创建Thread类对象 ,并将runnable实现类作为参数
Thread t1=new Thread(t,"窗口二");
t0.start();
t1.start();
}

public class tickets implements Runnable {
// 创建多线程的方式:1实现Runnable接口
private List<String> li; // 共享数据
票的编号01-100
private int ticket = 100; // 共享数据
// 利用构造函数加载初始数据
public tickets(List<String> li) {
this.li = li;
}
public tickets() {
super();
}// 空参数构造
@Override
public void run() {
//2.重写run方法
List<String> ticketNum =new ArrayList<String>();
int count = 0; // 局部数据是定义各自的计数
while (true) { //
synchronized (this) { // 同步代码块 这里加了锁 安全机制
if (ticket<=0) {
System.out.println(Thread.currentThread().getName() + "卖了" + count + "张,票的编号为:"+ticketNum);
return;
}
count++;
ticket--;
//---------------
Random ra=new Random();
int num = ra.nextInt(li.size()); //产生0-100的随机数,作为索引
ticketNum.add(li.get(num));
//根据索引来取集合中的数据
li.remove(num);
//因为取出来的票是不同的编号,取出一个就删除一个,避免重复


//两个进程交替执行
if(flag){
flag=true;
this.notify();//去唤醒另外一个进程
try {this.wait();} //本进程进行等待
catch (InterruptedException e) {	e.printStackTrace();}
}else{
flag=false;
this.notify(); //去唤醒另一个进程
try {this.wait();} //本进程等待
catch (InterruptedException e) {e.printStackTrace();}
}
}
}
}


总结:其实生活中很多场景都可以运行到多线程,12306火车购票时我们可以网上购票,也可以窗口购票。线程是不安全的,但是速度快。我们加上同步代码块的,加锁机制后,保证了安全性,但是不可避免的降低速度。在Java中有很多类我们用的时候是不安全的,但是速度快。正是因为我们对于速度的考虑。


最后

以上就是害怕皮皮虾为你收集整理的多线程解决窗口售票问题的全部内容,希望文章能够帮你解决多线程解决窗口售票问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部