Java线程:火车站购票,银行存钱,收取停车费,模拟员工制作工艺品【诗书画唱】
使用多线程模拟火车站购票问题

package thread;
public class huoCheZhan {
public static void main(String[] args) {
//用New创建多个窗口对象:
TicketClass TicketClass=new TicketClass();
Thread Thread1=new Thread(TicketClass);
Thread1.setName("窗口1");
Thread Thread2=new Thread(TicketClass);
Thread2.setName("窗口2");
Thread Thread3=new Thread(TicketClass);
Thread3.setName("窗口3");
//用start启动多线程对象:
Thread1.start();
Thread2.start();
Thread3.start();
}
}
class TicketClass implements Runnable {
int num=1;
int zongPiaoShu=99;
public void run() {
while(true) {
if(zongPiaoShu>0) {
synchronized (this) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
if(zongPiaoShu>=0){
System.out.println(Thread.currentThread()
.getName()+"买出了第"+(num++)+"张票, 还剩"+(zongPiaoShu--)+"张票没买出去");
}
}
}
}
}
}


模拟用户去银行存钱
/**
* 需求:有两个储户同时到一个银行去存钱,每人存3次,
* 每次存100元。
* 要求打印出银行每次金额的变化情况(假设银行没钱)
*
* 分析:得出有两个类:银行和储户
* 这是一个多线程的问题,如何分析他的线程安全问题呢?
* 1.通过线程的任务代码分析。
* 2.有没有共享数据,有没有多条语句在操作共享数据。
* */

package thread;
class Bank{
// moneySum:钱的总数
private int moneySum = 0;
// cunRuMoneyNum:每次存入的钱
public void add(int cunRuMoneyNum){
moneySum = moneySum + cunRuMoneyNum;
System.out.println(Thread.currentThread()
.getName()+
"向银行存了100元,银行现在有"
+moneySum+"元");
}
}
class Customer implements Runnable{
Bank yingHang = new Bank();
Object guKe = new Object();
@Override
public void run() {
synchronized (guKe) {
for(int i = 0;i<3;i++){
yingHang.add(100);
// 100:每次存入的100元钱
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public class blank {
public static void main(String[] args) {
Customer CustomerClass = new Customer();
Thread Thread1 =
new Thread(CustomerClass,"诗书画唱");
Thread Thread2 =
new Thread(CustomerClass,"三连关注");
Thread1.start();
Thread2.start();
}
}


小区收取停车费

package thread;
class ParkClass{
// moneySum:钱的总数
private int moneySum = 0;
// cunRuMoneyNum:每次停车交的钱
public void add(int cunRuMoneyNum){
moneySum = moneySum + cunRuMoneyNum;
System.out.println(Thread.currentThread()
.getName()+
"停车了,交100元 ,停车场现在有"
+moneySum+"元");
}
}
class CarCLass implements Runnable{
parkChangClass parkChangClass
= new parkChangClass();
Object carZhuRen = new Object();
// carZhuRen:车的主人
@Override
public void run() {
synchronized (carZhuRen) {
for(int i = 0;i<3;i++){
parkChangClass.add(100);
// 100:每次存入的100元钱
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public class tingChe {
public static void main(String[] args) {
Customer car = new Customer();
Thread Thread1 =
new Thread(car,"诗书画唱车");
Thread Thread2 =
new Thread(car,"三连关注车");
Thread Thread3 =
new Thread(car,"6666车");
Thread Thread4 =
new Thread(car,"2333车");
Thread1.start();
Thread2.start();
Thread3.start();
Thread4.start();
}
}


模拟员工制作工艺品,工艺品数量达到1000个以后不再制作

package thread;
import java.util.Random;
public class yuanGong {
public static void main(String[] args) throws Exception{
gongYiPinClass gongYiPinClass=new gongYiPinClass() ;
// 下面是省了重命名的部分,直接new实例化:
new Thread(gongYiPinClass, "诗书画唱的好员工").start();
new Thread(gongYiPinClass, "三连关注的好员工").start();
new Thread(gongYiPinClass,"2333的好员工").start();
}
}
class gongYiPinClass implements Runnable{
static int gongYiPinNum=999;
static int num=1;
public void run() {
while(gongYiPinNum>0){
synchronized (this) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(gongYiPinNum>=0){
System.out.println(Thread.currentThread()
.getName()+"做出了第"+(num++)+"个工艺品,"
+ "\n还有"+(gongYiPinNum--)+"个工艺品没做完");
}
// gongYiPinNum--;
}
}
}
}


用Java多线程模拟停车场停车和停车场满了,车离开等的情形:

package thread;
class Park
{
// park:停车场
boolean []park=new boolean[3];
public boolean equals()
{
return true;
}
}
class Car
{
private String number;
// position:位置
private int position=0;
public Car(String number)
{
this.number=number;
}
public void setNumber(String number)
{
this.number=number;
}
public String getNumber()
{
return number;
}
public void setPosition(int i)
{
position=i;
}
public int getPosition()
{
return position;
}
public int hashCode()
{
return number.hashCode();
}
// duiXiang:车等的对象
public boolean equals(Object duiXiang)
{
if(duiXiang==this)
return true;
if(duiXiang!=null&&duiXiang.getClass()
==Car.class)
{
Car Car=(Car)duiXiang;
return Car.number==this.number;
}
return false;
}
}
class ParkCar implements Runnable
{
Car Car;
Park Park;
public ParkCar(Car Car,Park Park)
{
this.Car=Car;
this.Park=Park;
}
@Override
public void run()
{
while(true)
{
int i=0;
synchronized(Park)
{
if(Car.getPosition()==0)
{
for(i=0;i<Park.park.length;i++)
{
if(Park.park[i])
{
continue;
}
else
{
System.out.println(Car.getNumber()+"车,成功停在"
+(i+1)+"号停车位上");
Park.park[i]=true;
Car.setPosition(i);
break;
}
}
if(i==3)
System.out.println
(Car.getNumber()+"车,停车失败"
+",因为停车场车位已满 "
);
}
try
{
Thread.sleep(100);
}
catch(InterruptedException ie)
{
ie.printStackTrace();
}
}
synchronized(Park)
{
if(Car.getPosition()!=0)
{
Park.park[Car.getPosition()]=false;
Car.setPosition(0);
System.out.println(Car.getNumber()
+"车,已离开停车场");
}
try
{
Thread.sleep(100);
}
catch(InterruptedException ie)
{
ie.printStackTrace();
}
}
}
}
}
public class tingCheChang {
public static void main(String []args)
{
Park Park=new Park();
Car Car1=new Car("诗书画唱号");
Car Car2=new Car("2333号");
Car Car3=new Car("6666号");
Car Car4=new Car("8888号");
Car Car5=new Car("三连关注号");
new Thread (new ParkCar(Car1,Park)).start();
new Thread (new ParkCar(Car3,Park)).start();
new Thread (new ParkCar(Car4,Park)).start();
new Thread (new ParkCar(Car5,Park)).start();
new Thread (new ParkCar(Car2,Park)).start();
}
}

