//21.用JAVA中的多线程示例火车站售票问题
//火车站售票,票有个成员记录自己的票数,
class Ticket{
private int num;
private static Ticket instance= null;
public static Ticket getInstance( int num){
if(instance == null){
instance = new Ticket(num);
}
return instance;
}
private Ticket( int num){
this.num = num;
}
public int getNum() {
return num;
}
public void setNum( int num) {
this.num = num;
}
public synchronized void sale(){
if( this.num > 0){
System.out.println(Thread.currentThread().getName()+ "卖出了一张票");
this.num--;
System.out.println( "还有: "+num+ " 张票!");
}
}
}
class SaleTicket implements Runnable{
private Ticket ticket;
public SaleTicket( int num){
this.ticket = Ticket.getInstance(num);
}
public void run() {
while(ticket.getNum() > 0){
ticket.sale();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class TestSaleTicket {
public static void main(String[] args) {
SaleTicket ticket = new SaleTicket(20);
new Thread(ticket, "甲--->").start();
new Thread(ticket, "乙--->").start();
new Thread(ticket, "丙--->").start();
}
}
//火车站售票,票有个成员记录自己的票数,
class Ticket{
private int num;
private static Ticket instance= null;
public static Ticket getInstance( int num){
if(instance == null){
instance = new Ticket(num);
}
return instance;
}
private Ticket( int num){
this.num = num;
}
public int getNum() {
return num;
}
public void setNum( int num) {
this.num = num;
}
public synchronized void sale(){
if( this.num > 0){
System.out.println(Thread.currentThread().getName()+ "卖出了一张票");
this.num--;
System.out.println( "还有: "+num+ " 张票!");
}
}
}
class SaleTicket implements Runnable{
private Ticket ticket;
public SaleTicket( int num){
this.ticket = Ticket.getInstance(num);
}
public void run() {
while(ticket.getNum() > 0){
ticket.sale();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class TestSaleTicket {
public static void main(String[] args) {
SaleTicket ticket = new SaleTicket(20);
new Thread(ticket, "甲--->").start();
new Thread(ticket, "乙--->").start();
new Thread(ticket, "丙--->").start();
}
}
联想到实现Runnable接口的线程可以实现共享数据,形成线程池。所以可以把票类里的成员变量和方法 放到Runnable接口的子类中,方便管理。
//21.用JAVA中的多线程示例火车站售票问题
//火车站售票,票有个成员记录自己的票数,
class SaleTicket implements Runnable{
private int num;
public SaleTicket( int num){
this.num = num;
}
public void run() {
while( this.num > 0){
sale();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void sale(){
if( this.num > 0){
System.out.println(Thread.currentThread().getName()+ "卖出了一张票");
this.num--;
System.out.println( "还有: "+num+ " 张票!");
}
}
}
public class TestSaleTicket {
public static void main(String[] args) {
SaleTicket ticket = new SaleTicket(20);
new Thread(ticket, "甲--->").start();
new Thread(ticket, "乙--->").start();
new Thread(ticket, "丙--->").start();
}
}
//火车站售票,票有个成员记录自己的票数,
class SaleTicket implements Runnable{
private int num;
public SaleTicket( int num){
this.num = num;
}
public void run() {
while( this.num > 0){
sale();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void sale(){
if( this.num > 0){
System.out.println(Thread.currentThread().getName()+ "卖出了一张票");
this.num--;
System.out.println( "还有: "+num+ " 张票!");
}
}
}
public class TestSaleTicket {
public static void main(String[] args) {
SaleTicket ticket = new SaleTicket(20);
new Thread(ticket, "甲--->").start();
new Thread(ticket, "乙--->").start();
new Thread(ticket, "丙--->").start();
}
}
另外同步分为同步代码块和同步代码方法,同步代码块容易放错位置,所以我就用同步代码方法,简单易用
转载于:https://blog.51cto.com/2301703/1033566