车票系统——synchronized语句
- 需要同步,两个车站,一个站点车票卖完了,总体数量要减1
- 可以用接口implement runnable 也可以用继承类extends Thread
- 主程序中采用while (true){},if else {break }语句,在public void run()中实现
- 实现同步a需要有public static (定义票数,若没有static,则总体数量各自运行) ,
b需要有synchronized 语句,他的作用是,让它所管辖的代码部分,要么全部执行完,要么全部不执行,若没有此语句,则第一张票会导致重复,用法
一定义字符串 :String aa = new String("1"); //字符串随意定义,定义在函数上边
二synchronized (aa)此语句放在while(true)语句中
一下为三个示例:第一个没有synchronized语句,第二个采用
售票系统1:
不能自动同线程识别其他站点车票是否卖完,第一张车票会重复
若不加public static则会如下结果
class Xc8 implements Runnable
{
public static int chepiao = 100;
public void run()
{
while (true)
{
if (chepiao > 0)
{
System.out.println("第"+Thread.currentThread().getName()+"个车站正在卖第"+(101-chepiao)+"张车票");
--chepiao;
}
else
{
break;
}
}
}
}
public class L68
{
public static void main(String[] args)
{
Xc8 xc81=new Xc8();
Thread ee = new Thread(xc81);
ee.start();
Xc8 xc82=new Xc8();
Thread ff = new Thread(xc82);
ff.start();
}
}
案例二:采用接口
class Xc9 implements Runnable
{
public static int chepiao = 100;
String aa = new String("1"); //字符串随意定义,定义在函数上边
//synchronized 的作用是,让它所管辖的代码部分,要么全部执行完,要么全部不执行
public void run() //synchronized修饰函数不需要字符串,相当于默认是this
{
while (true)
{
synchronized (aa) //既可以修饰代码块,又可以修饰函数
{
if (chepiao > 0)
{
System.out.println("第"+Thread.currentThread().getName()+"个车站正在卖第"+(101-chepiao)+"张车票");
--chepiao;
}
else
{
break;
}
}
}
}
}
public class L69
{
public static void main(String[] args)
{
Xc9 xc9=new Xc9();
Thread ee = new Thread(xc9);
ee.start();
Thread ff = new Thread(xc9);
ff.start();
}
}
案例三:继承类
class Xc10 extends Thread
{
public static int chepiao = 100;
public static String aa = new String("1");
public void run()
{
while (true)
{
synchronized (aa) // 两个线程的aa是线程自己的,并不是公共的
{
if (chepiao > 0)
{
System.out.println("第"+Thread.currentThread().getName()+"个车站正在卖第"+(101-chepiao)+"张车票");
--chepiao;
}
else
{
break;
}
}
}
}
}
public class L610
{
public static void main(String[] args)
{
Xc10 xc1=new Xc10();
xc1.start();
Xc10 xc2=new Xc10();
xc2.start();
}
}