/*
*本案例要实现的功能是四个售票点再卖票
*2、实现runnable的好处
*<1>正如本案例:处理同一资源的多个线程代码一般情况下就是实现runnable接口
*<2>如果你继承的Thread类来实现多线程,那么就不可以继承其他的类了
*<3>如果你创建的实现线程的类要通过构造函数传递参数,那么是实现的Thread类肯定不可能实现这个功能
*但是你如果实现的是Runnable接口就可以,而且大多数情况下实现多线程都是用Runnable接口,综上所需
*我们最好使用Runnable接口
*/
class LessonTestDemo1
{
public static void main(String [] args)
{
//这样去开启线程那么我们的四个售票点就都会售出100张票
/*new LessonDemo2().start();
new LessonDemo2().start();
new LessonDemo2().start();
new LessonDemo2().start();*/
//这种方式开启的线程实际上就一个售票点再售票
/*Thread tt = new LessonDemo2();
tt.start();
tt.start();
tt.start();
tt.start();*/
//一般想这种多个程序代码线程去处理同一个资源的情况,就是实现runnable接口
LessonDemo2 rr = new LessonDemo2();//这是买票同一资源
//下面是开启四个线程去卖同一资源的票
//这是第一个售票点卖票
Thread tt1 = new Thread(rr);
tt1.start();
//这是第二个售票点卖票
Thread tt2 = new Thread(rr);
tt2.start();
//这是第三个售票点卖票
Thread tt3 = new Thread(rr);
tt3.start();
//这是第四个售票点卖票
Thread tt4 = new Thread(rr);
tt4.start();
}
}
//这是一个卖票的线程
class LessonDemo2 implements Runnable
{
private int tickets = 100;
//如果一个类实现了runnable接口,那么这个类也可以实现多线程,只不过,当开启这个线程的时候
//我们执行的不是Thread的start方法,而是我们的runnable接口的run方法
public void run()
{
while(true)
{
if(tickets > 0)
{
System.out.println(Thread.currentThread().getName() + " is saling a ticket " + tickets--);
}
}
}
}
//下面是易出错的几种形式
//这是一个卖票的线程
/*class LessonDemo2 extends Thread
{
private int tickets = 100;
//如果一个类实现了runnable接口,那么这个类也可以实现多线程,只不过,当开启这个线程的时候
//我们执行的不是Thread的start方法,而是我们的runnable接口的run方法
public void run()
{
if(tickets > 0)
{
System.out.println(Thread.currentThread().getName() + " is saling a ticket " + tickets--);
}
}
}*/
*本案例要实现的功能是四个售票点再卖票
*2、实现runnable的好处
*<1>正如本案例:处理同一资源的多个线程代码一般情况下就是实现runnable接口
*<2>如果你继承的Thread类来实现多线程,那么就不可以继承其他的类了
*<3>如果你创建的实现线程的类要通过构造函数传递参数,那么是实现的Thread类肯定不可能实现这个功能
*但是你如果实现的是Runnable接口就可以,而且大多数情况下实现多线程都是用Runnable接口,综上所需
*我们最好使用Runnable接口
*/
class LessonTestDemo1
{
public static void main(String [] args)
{
//这样去开启线程那么我们的四个售票点就都会售出100张票
/*new LessonDemo2().start();
new LessonDemo2().start();
new LessonDemo2().start();
new LessonDemo2().start();*/
//这种方式开启的线程实际上就一个售票点再售票
/*Thread tt = new LessonDemo2();
tt.start();
tt.start();
tt.start();
tt.start();*/
//一般想这种多个程序代码线程去处理同一个资源的情况,就是实现runnable接口
LessonDemo2 rr = new LessonDemo2();//这是买票同一资源
//下面是开启四个线程去卖同一资源的票
//这是第一个售票点卖票
Thread tt1 = new Thread(rr);
tt1.start();
//这是第二个售票点卖票
Thread tt2 = new Thread(rr);
tt2.start();
//这是第三个售票点卖票
Thread tt3 = new Thread(rr);
tt3.start();
//这是第四个售票点卖票
Thread tt4 = new Thread(rr);
tt4.start();
}
}
//这是一个卖票的线程
class LessonDemo2 implements Runnable
{
private int tickets = 100;
//如果一个类实现了runnable接口,那么这个类也可以实现多线程,只不过,当开启这个线程的时候
//我们执行的不是Thread的start方法,而是我们的runnable接口的run方法
public void run()
{
while(true)
{
if(tickets > 0)
{
System.out.println(Thread.currentThread().getName() + " is saling a ticket " + tickets--);
}
}
}
}
//下面是易出错的几种形式
//这是一个卖票的线程
/*class LessonDemo2 extends Thread
{
private int tickets = 100;
//如果一个类实现了runnable接口,那么这个类也可以实现多线程,只不过,当开启这个线程的时候
//我们执行的不是Thread的start方法,而是我们的runnable接口的run方法
public void run()
{
if(tickets > 0)
{
System.out.println(Thread.currentThread().getName() + " is saling a ticket " + tickets--);
}
}
}*/