线程模拟售票问题

线程是我们学习Java知识中一个重要的难点,首先我们要明白两种创建线程的方法,其次在售票问题中我们要注意线程并发带来的线程安全问题。

最后我们要明白几个重要的概念:

①保证代码原子性:所谓代码原子性是指当a线程在执行某段代码块的时候,别的线程必须等待 ,直到a线程执行完才可以执行这段代码。

②对象锁:java中处理线程同步的办法非常简单,只需要在你需要同步的代码块上加上语句:synchronized (object) {需要同步的代码块} ,即可。

③获取线程名称的方法:Thread.currentThread().getName()。

代码如下:

package com.thread;

public class ThreadShouPiao {

/**
* 功能:线程售票:解决线程并发带来的线程安全问题(保证代码的原子性)
* 对象锁的概念
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个售票窗口对象
ThreadWindowTicks twk=new ThreadWindowTicks();
//创建三个线程,同时启用
Thread th1=new Thread(twk);
Thread th2=new Thread(twk);
Thread th3=new Thread(twk);
th1.start();
th2.start();
th3.start();
}
}
//窗口售票类
class ThreadWindowTicks implements Runnable{

private int piao_num=2000;

public void run() {
// TODO Auto-generated method stub
while(true){
//要保证if else语句原子性(同步代码块)
synchronized (this) {//对象锁
if(piao_num>0&&piao_num<=2000){
System.out.println(Thread.currentThread().getName()+"卖第"+piao_num+"张票");
try {
Thread.sleep(1000);

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
piao_num--;
}
else {
break;
}
}
}
}
}

原文地址:https://www.cnblogs.com/zhouguoshuai/p/10129106.html

时间: 2024-10-17 19:47:36

线程模拟售票问题的相关文章

创建两个线程模拟火车站两个窗口售票程序

题目:创建两个线程模拟火车站两个窗口售票程序,窗口售票时间为1秒,两个窗口不能同时售票 #include<Windows.h> #include<iostream> using namespace std; //这是2个线程模拟买火车票的小程序 DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread data DWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread data int inde

使用无锁完成多线程模拟售票, 理解无锁是啥?

实现的模拟多线程实现售票是每个学习多线程的初学者必须要学会掌握的知识点, 既然掌握的它, 我们自然要举一反三 So~, 无锁版出现了 What无锁? 假如两个线程同时修改一个变量的场景下 我们需要三个值, 预期值(线程副本变量中的值), 主存值(从主存变量中的值), 新值(我们要设置的值) 如果 预期值 不等于 主存值 则忽略 新值 写入  =========> 这句话是一个原子操作, 是不可分割的(就是内存屏障), 在执行这个过程中, 是不会失去时间片的 如果 预期值 等于 主存值 则  新值

多线程模拟售票

需求:某电影院出售某些电影的票(复联3,红高粱....),有三个窗口同时进行售票(100张票),请您设计一个程序,模拟电影院售票两种方式:继承接口(1)synchronized实现public class SellTicketDemo { public static void main(String[] args) { //创建资源类对象(共享资源类/目标对象) SellTicket st = new SellTicket() ; //创建线程类对象 Thread t1 = new Thread

python 以面向对象的方式创建线程 实现售票系统

---恢复内容开始--- 通过面向对象的方法实现多线程,其核心是继承threading.Thread类.我们自己定义了一个类BoothThread, 这个类继承自thread.Threading类,通过修改Thread类的run()方法来定义线程所要执行的命令. 1 import threading # Python主要通过标准库中的threading包来实现多线程 2 import time 3 import os 4 5 #作为间隔 每次调用间隔0.5s 6 def doChore(): 7

C#使用进度条,并用线程模拟真实数据 ProgressBar用法(转)

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; namespace jmyd.form { public partial class

用java多线程操作模拟售票系统

class Threadsale implements Runnable{ int tickets = 100; public void run(){ while(true){ if(tickets>0){ System.out.println(Thread.currentThread().getName()+"售车票第"+tickets--+"号"); } else System.exit(0); } } } public class DemoThread

模拟售票程序(关于多线程共享的练习)

继承Tread来实现多线程的话,写出的类就是Thread的一个子类,所以用这个自定义类产生的对象就是一个线程:而通过实现Runnable实现类来实现多线程,还要声明一个Thread类的对象,将这个Runnable实现类的对象传入Thread类的一个构造函数来声明一个Thread对象,这个对象才是一个真正的线程对象,而且可以通过将同一个Runnable实现类的对象传入Thread构造器来实现多进程共享. 代码实现: package threadDemo; public class Tickets_

线程模拟线程

class LoadDown implements Runnable{ static double num=0; static double n1 =0; static double n2 =0; static double n3 =0; static double n4 =0; public void run(){ while(true){ synchronized ("锁") { if (num<=500) { try { Thread.sleep(10); } catch

模拟售票

共享的资源是票,tickitsNum记录票的销售情况 对售票的过程进行加锁synchronized(this){},