吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4113|回复: 5
收起左侧

[Java 转载] Java学习笔记-Java多线程卖票的小事例

[复制链接]
昕悦阁丶风雪 发表于 2015-7-16 12:01
脱离视频,自己写Java实例,带着问题写代码
[Java] 纯文本查看 复制代码
public class TicketDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Ticket t = new Ticket();
		//4个窗口同时卖票的小事例
		new Thread(t).start();
		new Thread(t).start();
		new Thread(t).start();
		new Thread(t).start();

	}

}
/*
 * Ticket.class 是可以正确执行的类*/
class Ticket implements Runnable
{
	private int ticket = 100;
	Object obj = new Object();
	public void run()
	{
		while(true)
		{
			synchronized(obj)
			{
				if(ticket>0)
				{
					try
					{
						Thread.sleep(10);					
					}
					catch(Exception e)
					{
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+"卖了第"+(ticket--)+"张票");
				
				}
				else
					break;//票卖完了,当然要退出线程了。。
			}
		}
	}
}
/*
 * TicketErr是引起错误现象的类*/
class TicketErr extends Thread
{
	private int ticket = 100;
	public void run()
	{
		while(true)
		{
			if(ticket>0)
			{
				/*
				 * .......
				 * Thread-3卖了第1张票
					Thread-0卖了第0张票
					Thread-2卖了第-1张票
					Thread-1卖了第-2张票
					
					问题描述:
					这四个窗口中出现了错票。
					为什么会出现这个问题呢?
					是因为:这四个线程在操作同一个资源(票),票还剩1张时,当A线程刚刚判断完ticket>0,还没有
					打印出票,CPU执行权就被另一个线程(B)抢去了,B线程判断票也大于0(1>0),
					等B线程执行完(也就是票还剩0张),A线程拿到执行权,打印出票信息(卖出-1张)票。
					
					该问题如何解决?
					
					操作同一个资源时,只让进入一个线程进入执行,其他线程排队进入。
					要想实现这个方式,则引入锁的机制。将操作资源的代码块“锁”起来
				 */
				try
				{					
					Thread.sleep(10);				
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName()+"卖了第"+(ticket--)+"张票");
			}
			else
				break;
		}
	}
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

LaoJII 发表于 2015-7-16 12:17
谢啦。楼主好人一个
Very_good 发表于 2015-7-16 13:14
zllp32 发表于 2015-7-17 11:00
lbq凯越 发表于 2015-7-21 12:45
谢谢啊 ,我也是学Java的,多看看源代码对我有很大的帮助
偷偷去偷鸡 发表于 2016-8-23 14:00
加锁lock,或者同步方法
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 15:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表