今天在家试着调了一个程序,功能实现了,不过在调试过程中发现有一个语句,在不同的地方,一个能编译通过并运行,一个则提示是错误,但是不明白为什么,请高手帮解释一下为什么会这样。出问题的语句为红色字那部分,O(∩_∩)O谢谢~~~
package yumin.com;
import java.util.Scanner;
/*
编写三个类Ticket.sealWidow,TicketSealCenter 分别是代表票信息,售票窗口,售票中心
售票中心分配若干数量的票,由若干售票窗出售
分析:
售票中心定义若干票,这个票要么在类里面定义,要么从键盘输入
售票信息则代表显示信息
售票窗有多个,实时对票进行操作,则使用多线程
多线程实现由两种方法,一种是继承Thread ,另一种为实现Runable接口
*/
class TicketSealCenter//从键盘获取票数
{
public int getTicket()
{
System.out.println("输入总票数");
Scanner sc =new Scanner(System.in);
int ticket = sc.nextInt();
sc.close();
return ticket;
}
}
class Ticket
{
public synchronized void show(int tickets)//显示票数
{
if( tickets >0)
{
System.out.println("现有余票为:"+tickets);
}
else
{
System.out.println("票已经卖完");
}
}
}
class SealTicket implements Runnable //卖票窗口
{
private Ticket t = new Ticket();
private int tickets =new TicketSealCenter(). getTicket();//从键盘获取票数
// t.show(tickets);// 这个语句无法使用,编译不通过,但是同样的语句在if(tickets >0)下可以调用,这是为什么呢?
Object obj =new Object();
boolean flag = true;
public void run()
{
// t.show();
while(flag)
{
synchronized (obj)
{
if(tickets >0)
{
System.out.println(Thread.currentThread().getName()+"....seal:"+tickets);
tickets--;
t.show(tickets);//同样的语句,这里就可以调用
}
else
{
System.out.println("没票了");
flag = false;
return;
}
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
SealTicket s =new SealTicket();
Thread t1 =new Thread(s);
Thread t2 =new Thread(s);
Thread t3 =new Thread(s);
t1.start();
t2.start();
t3.start();
}
}
|