学习java多线程知识点–线程安全与同步
基础练习–模拟多窗口卖票程序。
#1.多窗口卖票–各自卖票
package com.cc.sellticket;
/**
* 模拟多窗口卖票 -- 每个窗口各自卖票
* @author CC
*
*/
public class SellTicket1 extends Thread{
private int tickets = 50;
public SellTicket1(String name) {
super(name);
}
@SuppressWarnings("static-access")
@Override
public void run() {
super.run();
while(tickets > 0) {
tickets-- ;
System.out.println(this.currentThread().getName()+"窗口卖了第"+(50-tickets)+"张票");
}
}
}
package com.cc.sellticket;
/**
* 模拟多窗口卖票
* 每个窗口50张票,各自卖各自的票直到卖完
* @author CC
*
*/
public class TestForSellTicket1 {
public static void main(String[] args) {
SellTicket1 sell1 = new SellTicket1("1号");
SellTicket1 sell2 = new SellTicket1("2号");
SellTicket1 sell3 = new SellTicket1("3号");
SellTicket1 sell4 = new SellTicket1("4号");
sell1.start();
sell2.start();
sell3.start();
sell4.start();
}
}
#2.多窗口卖票–共同卖票
package com.cc.sellticket;
/**
* 模拟多窗口卖票 -- 多个窗口共同卖票
* @author CC
*
*/
public class SellTicket2 extends Thread{
//因为循环需控制所有线程票数大于0
private int tickets = 50;
@Override
public void run() {
super.run();
while(true) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
sell();
} catch (Exception e) {
System.out.println(e.getMessage());
return;
}
}
}
synchronized private void sell() throws Exception {
if(tickets <= 0) {
throw new Exception(SellTicket2.currentThread().getName()+"窗口停止售票!");
}
tickets -- ;
System.out.println(SellTicket2.currentThread().getName()+"窗口卖了第"+(50-tickets)+"张票");
}
}
package com.cc.sellticket;
public class TestForSellTicket2 {
public static void main(String[] args) {
SellTicket2 sell = new SellTicket2();
Thread thread1 = new Thread(sell,"1号");
Thread thread2 = new Thread(sell,"2号");
Thread thread3 = new Thread(sell,"3号");
Thread thread4 = new Thread(sell,"4号");
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
大家有没有发现我的错误,我是好像发现了,哭奔。
#2.1多窗口卖票–共同卖票 (修正版)
synchronized用法:对象锁而不是方法锁,现改成如下:
package com.cc.sellticket2;
public class TicketNum {
private int tickets = 50;
public TicketNum() {
super();
}
public TicketNum(int tickets) {
super();
this.tickets = tickets;
}
public int getTickets() {
return tickets;
}
public void setTickets(int tickets) {
this.tickets = tickets;
}
synchronized public void sellTickets() throws Exception {
if(tickets > 0) {
tickets-- ;
System.out.println(Thread.currentThread().getName()+"窗口卖了1张票,待卖票数:"+tickets);
}else {
throw new Exception("买完了");
}
}
}
package com.cc.sellticket2;
public class SellTicketsThread extends Thread{
private TicketNum ticketNum;
public SellTicketsThread(TicketNum ticketNum) {
super();
this.ticketNum = ticketNum;
}
@Override
public void run() {
while(true) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
ticketNum.sellTickets();
} catch (Exception e) {
System.out.println("卖完了!");
break;
}
}
}
}
package com.cc.sellticket2;
public class Run1 {
public static void main(String[] args) {
TicketNum ticketNum = new TicketNum(50);
SellTicketsThread t1 = new SellTicketsThread(ticketNum);
t1.setName("1号");
SellTicketsThread t2 = new SellTicketsThread(ticketNum);
t2.setName("2号");
SellTicketsThread t3 = new SellTicketsThread(ticketNum);
t3.setName("3号");
SellTicketsThread t4 = new SellTicketsThread(ticketNum);
t4.setName("4号");
t1.start();
t2.start();
t3.start();
t4.start();
}
}