java多线程实现火车售票系统 以及java中的同步的实现 同步块 和同步方法同时 同步...

本文探讨了使用Java多线程模拟火车站售票系统,并深入理解Java中的同步机制,包括同步块和同步方法的实现,以及如何通过监视器确保临界区的正确访问顺序。

/*
利用Java 多线程模拟火车站售票系统 了解java中的同步


class Test
{
public static void main(String []args)
{
SellThread st=new SellThread(); //创建一个实现了implements接口的对象
new Thread(st).start(); //启动四个Thread
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
}
}

class SellThread implements Runnable
{
int index =100;
public void run()
{
while(true)
{
if(index>0)
{
try
{
Thread.sleep(10); //函数抛出异常我们要进行异常捕获 休眠之后 所有Thread等待在这里
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"sell tickets "+ index--);
}
}
}

}


*/

/*

上面的代码 不能保证同步 即每次只允许一个 THREAD访问 资源 我们要对这个临界区进行保护
每个对象都有一个监视器 通过检测对象是否被枷锁 从而判断是否进入临界区
同步快监视的是任意 对象 而同步方法监视的是 this 对象

有2种方法 1.同步块 2.同步方法
1. synchronized( Object)
{
......

}
2.方法前面加上 synchronized修饰

class Test
{
public static void main(String []args)
{
SellThread st=new SellThread(); //创建一个实现了implements接口的对象
new Thread(st).start(); //启动四个Thread
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
}
}

class SellThread implements Runnable
{
int index =100;


*/
///////////////////////同步块
/*public void run()
{
while(true)
{
synchronized(this) //通过对象监视器枷锁每次只有一个线程进入临界区这个监视对象可以是任意
{
if(index>0)
{
System.out.println(Thread.currentThread().getName()+"sell tickets "+ index--);
}
}
}
}
//////////////////////同步块
public void run()
{
while(true)
{

sell(); //调用同步方法进行控制
}
}

/////////////////////////同步方法
synchronized public void sell()
{
if(index>0)
{
System.out.println(Thread.currentThread().getName()+"sell tickets "+ index--);
}
}

///////////////////////同步方法

}


*/

///////////////////////同步快与同步方法实现同步


class Test
{
public static void main(String []args) throws Exception
{
SellThread st=new SellThread(); //创建一个实现了implements接口的对象
new Thread(st).start(); //启动四个Thread
Thread.sleep(1);
st.b=true ; //
new Thread(st).start();
}
}

class SellThread implements Runnable
{
int index =100;
boolean b=false; //用来实现同步
Object o=new Object(); //获得一个检测对象

///////////////////////同步块
public void run()
{
if(b==false)
{
while(true)
{
synchronized(o) //同步块可以监视任意对象但是 同步方法只能监视this 对象
{
if(index>0)
System.out.println("this "+Thread.currentThread().getName()+"sell ticket "+index--);
}
}
}
else
{
while(true)
if(index>0)
{
sell();
}
}
}
/////////////////////////同步方法
synchronized public void sell()
{
if(index>0)
{
System.out.println("this2 " +Thread.currentThread().getName()+"sell tickets "+ index--);
}
}


}

目录 第一章. 概述 1 1.1概述 1 1.2意义 1 1.3任务 1 第二章. 系统的可行性研究与需求分析 2 2.1可行性研究 2 2.1.1经济可行性 2 2.1.2技术可行性 2 2.1.3操作可行性 2 2.2需求分析 2 2.2.1功能需求 2 2.2.2数据需求 3 2.2.3性能需求 3 2.2.4数据库逻辑结构 6 第三章. 系统的总体设计 7 3.1系统软件结构设计 7 3.1.1软件结构 7 3.2系统流程图 9 第四章. 系统的详细设计 10 4.1.1程序流程图 11 第五章. 系统的实现与调试 18 5.1应用系统的开发及测试 18 5.1.1系统首页 18 5.1.2用户登录及访问权限 19 5.1.3车次信息查询 21 5.1.4售票 21 5.15退票 22 结束语 23 致谢.....................................................................24 参考文献 25 附录A...............................................................................26附录B...............................................................................30 附录C............................................................................. 32 附录 登陆窗 #region Windows 窗体设计器生成的代码 private void InitializeComponent() { this.lblID = new System.Windows.Forms.Label(); this.lblPassWord = new System.Windows.Forms.Label(); this.cbSelect = new System.Windows.Forms.ComboBox(); this.lblSelect = new System.Windows.Forms.Label(); this.txtID = new System.Windows.Forms.TextBox(); this.txtPassWord = new System.Windows.Forms.TextBox(); this.btnCancel = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); this.skinEngine1 = new Sunisoft.IrisSkin.SkinEngine(((System.ComponentModel.Component)(this))); this.btnEnter = new System.Windows.Forms.Button(); this.SuspendLayout(); // LoginForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoValidate = System.Windows.Forms.AutoValidate.EnablePreventFocusChange; this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; this.ClientSize = new System.Drawing.Size(322, 312); this.Controls.Add(this.label1); this.Controls.Add(this.btnCancel); this.Controls.Add(this.btnEnter); this.Controls.Add(this.txtPassWord); this.Controls.Add(this.txtID); this.Controls.Add(this.lblSelect); this.Controls.Add(this.cbSelect); this.Controls.Add(this.lblPassWord); this.Controls.Add(this.lblID); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; this.MaximumSize = new System.Drawing.Size(332, 348); this.MinimumSize = new System.Drawing.Size(332, 348); this.Name = "LoginForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "登录界面"; this.Load += new System.EventHandler(this.Login_Load); this.ResumeLayout(false); this.PerformLayout(); } } } 附录B 主界面 namespace TicketMana { partial class SellerForm { /// /// 必需的设计器变量。 /// private System.ComponentModel.IContainer components = null; namespace TicketMana { partial class SellTicketForm { /// /// 必需的设计器变量。 /// private System.ComponentModel.IContainer components = null; /// /// 清理所有正在使用的资源。 /// /// 如果应释放托管资源,为 true;否则为 false。
模拟火车票管理系统 package com.qdlg.trainticketmanger.service; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.JOptionPane; import com.qdlg.trainticketmanger.model.DBConnection; import com.qdlg.trainticketmanger.model.Ticket; public class TicketManager { /** * * @param train * @return */ public int addTicket(Ticket ticket){ String sql="insert into ticket(ticketNumber,trainNumber,trainDate,startStation,endStation," + "price,carriageNum,seatNum,type,grade,userId,trainTime) values(?,?,?,?,?,?,?,?,?,?,?,?)"; Connection conn=DBConnection.getConn(); PreparedStatement pst=null; int number =0; try { pst = conn.prepareStatement(sql); pst.setString(1,ticket.getTicketNumber()); pst.setString(2,ticket.getTrainNumber()); pst.setString(3,ticket.getTrainDate()); pst.setString(4,ticket.getStartStation()); pst.setString(5,ticket.getEndStation()); pst.setDouble(6,ticket.getPrice()); pst.setInt(7,ticket.getCarriageNum()); pst.setInt(8,ticket.getSeatNum()); pst.setString(9,ticket.getType()); pst.setString(10,ticket.getGrade()); pst.setInt(11,ticket.getUserId()); pst.setString(12,ticket.getTrainTime()); number=pst.executeUpdate(); //JOptionPane.showMessageDialog(null, "存储成功!", "SUCCESS", JOptionPane.INFORMATION_MESSAGE) ; return number; } catch (SQLException e) { e.printStackTrace(); } return number; } /** * 批量添加 * @param list * @return */ public int addAll(List list){ //建立数据库操作 Connection conn=DBConnection.getConn(); Statement sta=null; try { sta=conn.createStatement(); //将自动提交模式转换为手动提交模式 conn.setAutoCommit(false); Iterator iter = list.iterator(); //循环将数据准换成SQL语句 while(iter.hasNext()){ Ticket ticket =iter.next(); sta.addBatch("insert into ticket(ticketNumber,trainNumber,trainDate,startStation,endStation,"+ "price,carriageNum,seatNum,type,grade,userId) values ('"+ ticket.getTicketNumber()+"','"+ ticket.getTrainNumber()+"','"+ ticket.getTrainDate()+"','"+ ticket.getStartStation()+"','"+ ticket.getEndStation()+"','"+ ticket.getPrice()+","+ ticket.getCarriageNum()+","+ ticket.getSeatNum()+","+ ticket.getType()+","+ ticket.getGrade()+","+ ticket.getUserId()+")"); } //执行批量处理,提交事务 int [] batchNumber=sta.executeBatch(); conn.commit(); //将手动提交模式转换为自动提交模式 conn.setAutoCommit(true); return batchNumber.length; } catch (SQLException e) { JOptionPane.showMessageDialog(null, "请检查"+e.getMessage(), "系统不允许您重复录入重名物料", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); try { //操作出现异常时,回滚事务 conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } }finally{ try { //关闭Conn conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return 0; } /** * * @param trainId */ public void delete(int ticketId){ String sql="delete from ticket where id=?"; Connection conn=DBConnection.getConn(); PreparedStatement pst=null; try { pst = conn.prepareStatement(sql); pst.setInt(1,ticketId); pst.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); JOptionPane.showMessageDialog(null, "NOthing ", "youqingtishi", JOptionPane.ERROR_MESSAGE); } } public boolean delete(String ticketNumber,String trainNumber){ String sql="delete from ticket where ticketNumber=? and trainNumber=?"; Connection conn=DBConnection.getConn(); PreparedStatement pst=null; try { pst = conn.prepareStatement(sql); pst.setString(1,ticketNumber); pst.setString(2,trainNumber); int number=pst.executeUpdate(); if(number>0){ return true; }else{ return false; } } catch (SQLException e) { e.printStackTrace(); } return false; } /** * * @param train */ public void update(Ticket ticket){ String sql="update ticket set ticketNumber=?,trainNumber=?,trainDate=?,startStation=?,endStation=?," + "price=?,carriageNum=?,seatNum=?,type=?,grade=?,userId=? where id=?"; Connection conn=DBConnection.getConn(); PreparedStatement pst=null; try { pst = conn.prepareStatement(sql); pst.setString(1,ticket.getTicketNumber()); pst.setString(2,ticket.getTrainNumber()); pst.setString(3,ticket.getTrainDate()); pst.setString(4,ticket.getStartStation()); pst.setString(5,ticket.getEndStation()); pst.setDouble(6,ticket.getPrice()); pst.setInt(7,ticket.getCarriageNum()); pst.setInt(8,ticket.getSeatNum()); pst.setString(9,ticket.getType()); pst.setString(10,ticket.getGrade()); pst.setInt(11,ticket.getUserId()); pst.setInt(12,ticket.getId()); pst.executeUpdate(); // JOptionPane.showMessageDialog(null, "OK", "SUCCESS", JOptionPane.INFORMATION_MESSAGE) ; } catch (SQLException e) { e.printStackTrace(); } } public Ticket findById(Integer id) throws SQLException{ Ticket ticket=new Ticket(); String sql="select * from ticket where id=? "; Connection conn=DBConnection.getConn(); PreparedStatement pst=null; ResultSet rs=null; pst = conn.prepareStatement(sql); pst.setInt(1,id); rs=pst.executeQuery(); if(rs.next()){ ticket.setTicketNumber(rs.getString("ticketNumber")); ticket.setTrainNumber(rs.getString("trainNumber")); ticket.setTrainDate(rs.getString("trainDate")); ticket.setStartStation(rs.getString("startStation")); ticket.setEndStation(rs.getString("endStation")); ticket.setPrice(rs.getDouble("price")); ticket.setCarriageNum(rs.getInt("carriageNum")); ticket.setSeatNum(rs.getInt("seatNum")); ticket.setType(rs.getString("type")); ticket.setGrade(rs.getString("grade")); ticket.setUserId(rs.getInt("userId")); ticket.setId(rs.getInt("id")); } return ticket; } public Integer getIdId() throws SQLException{ String sql="select id from ticket"; Integer id=1; Connection conn=DBConnection.getConn(); PreparedStatement pst=null; ResultSet rs=null; pst = conn.prepareStatement(sql); rs=pst.executeQuery(); if(rs.next()){ rs.afterLast(); rs.previous(); id=rs.getInt("id"); } return id; } /** * * @return * @throws SQLException */ public Integer findUserId() throws SQLException{ String sql="select * from ticket"; Connection conn=DBConnection.getConn(); PreparedStatement pst=null; ResultSet rs=null; Integer userId=1; pst = conn.prepareStatement(sql); rs=pst.executeQuery(); if(rs.next()){ rs.afterLast(); rs.previous(); userId=rs.getInt("userId"); } return userId; } //anyonghuchaxun public List findByUserIdId(Integer userId) throws SQLException{ String sql="select * from ticket where userId=? "; Connection conn=DBConnection.getConn(); PreparedStatement pst=null; ResultSet rs=null; pst = conn.prepareStatement(sql); pst.setInt(1,userId); Ticket ticket=null; List list=new ArrayList(); rs=pst.executeQuery(); while(rs.next()){ ticket=new Ticket(); ticket.setTicketNumber(rs.getString("ticketNumber")); ticket.setTrainNumber(rs.getString("trainNumber")); ticket.setTrainDate(rs.getString("trainDate")); ticket.setTrainTime(rs.getString("trainTime")); ticket.setStartStation(rs.getString("startStation")); ticket.setEndStation(rs.getString("endStation")); ticket.setPrice(rs.getDouble("price")); ticket.setCarriageNum(rs.getInt("carriageNum")); ticket.setSeatNum(rs.getInt("seatNum")); ticket.setType(rs.getString("type")); ticket.setGrade(rs.getString("grade")); ticket.setUserId(rs.getInt("userId")); ticket.setId(rs.getInt("id")); list.add(ticket); } return list; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值