用继承Runnable来模拟火车售票案例

第一次代码:

package 线程;

public class RunnableTicket {
    public static void main(String[] args) {
        Mythread mythread = new Mythread();
        new Thread(mythread).start();
        new Thread(mythread).start();
        new Thread(mythread).start();
        new Thread(mythread).start();
    }
}

class Mythread implements Runnable {
    private int number = 100;
    @Override
    public void run() {
        while (true) {
            if (number == 0) {
                break;
            }
            System.out.println(Thread.currentThread().getName() + "...这是第" + number-- + "张票");
        }
    }
}

结果如下:

Thread-2...这是第98张票
Thread-2...这是第96张票
Thread-2...这是第95张票
Thread-2...这是第94张票
Thread-2...这是第93张票
Thread-2...这是第92张票
Thread-2...这是第91张票
Thread-2...这是第90张票
Thread-2...这是第89张票
Thread-2...这是第88张票
Thread-2...这是第87张票
Thread-2...这是第86张票
Thread-2...这是第85张票
Thread-2...这是第84张票
Thread-2...这是第83张票
Thread-2...这是第82张票
Thread-2...这是第81张票
Thread-2...这是第80张票
Thread-2...这是第79张票
Thread-2...这是第78张票
Thread-2...这是第77张票
Thread-2...这是第76张票
Thread-0...这是第100张票
Thread-0...这是第74张票
Thread-0...这是第73张票
Thread-0...这是第72张票
Thread-0...这是第71张票
Thread-0...这是第70张票
Thread-0...这是第69张票
Thread-0...这是第68张票
Thread-0...这是第67张票
Thread-0...这是第66张票
Thread-0...这是第65张票
Thread-0...这是第64张票
Thread-0...这是第63张票
Thread-0...这是第62张票
Thread-0...这是第61张票
Thread-0...这是第60张票
Thread-0...这是第59张票
Thread-0...这是第58张票
Thread-0...这是第57张票
Thread-2...这是第75张票
Thread-2...这是第55张票
Thread-2...这是第54张票
Thread-0...这是第56张票
Thread-0...这是第52张票
Thread-1...这是第99张票
Thread-1...这是第50张票
Thread-1...这是第49张票
Thread-1...这是第48张票
Thread-1...这是第47张票
Thread-1...这是第46张票
Thread-1...这是第45张票
Thread-3...这是第97张票
Thread-3...这是第43张票
Thread-3...这是第42张票
Thread-3...这是第41张票
Thread-3...这是第40张票
Thread-3...这是第39张票
Thread-3...这是第38张票
Thread-3...这是第37张票
Thread-3...这是第36张票
Thread-3...这是第35张票
Thread-1...这是第44张票
Thread-1...这是第33张票
Thread-1...这是第32张票
Thread-1...这是第31张票
Thread-0...这是第51张票
Thread-0...这是第29张票
Thread-0...这是第28张票
Thread-0...这是第27张票
Thread-0...这是第26张票
Thread-0...这是第25张票
Thread-0...这是第24张票
Thread-0...这是第23张票
Thread-0...这是第22张票
Thread-0...这是第21张票
Thread-0...这是第20张票
Thread-0...这是第19张票
Thread-0...这是第18张票
Thread-0...这是第17张票
Thread-0...这是第16张票
Thread-0...这是第15张票
Thread-0...这是第14张票
Thread-0...这是第13张票
Thread-0...这是第12张票
Thread-0...这是第11张票
Thread-0...这是第10张票
Thread-2...这是第53张票
Thread-2...这是第8张票
Thread-2...这是第7张票
Thread-2...这是第6张票
Thread-2...这是第5张票
Thread-2...这是第4张票
Thread-2...这是第3张票
Thread-2...这是第2张票
Thread-2...这是第1张票
Thread-0...这是第9张票
Thread-1...这是第30张票
Thread-3...这是第34张票

运行结果回一下就出来,我们希望它每隔一会再出来,所以加上睡眠线程:

package 线程;

public class RunnableTicket {
    public static void main(String[] args) {
        Mythread mythread = new Mythread();
        new Thread(mythread).start();
        new Thread(mythread).start();
        new Thread(mythread).start();
        new Thread(mythread).start();
    }
}

class Mythread implements Runnable {
    private int number = 100;
    @Override
    public void run() {
        while (true) {
            if (number == 0) {
                break;
            }
            try {
            Thread.sleep(10);
            } catch (InterruptedException e) {
            e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "...这是第" + number-- + "张票");
        }
    }
}

运行结果如下:
省略以上的运行结果

Thread-1...这是第-203张票
Thread-0...这是第-203张票
Thread-1...这是第-204张票
Thread-0...这是第-204张票
Thread-1...这是第-205张票
Thread-0...这是第-206张票
Thread-1...这是第-207张票
Thread-0...这是第-208张票
Thread-0...这是第-209张票
Thread-1...这是第-210张票
Thread-0...这是第-212张票
Thread-1...这是第-211张票
Thread-1...这是第-213张票
Thread-0...这是第-213张票
Thread-0...这是第-214张票
Thread-1...这是第-215张票
Thread-0...这是第-216张票
Thread-1...这是第-217张票
Thread-0...这是第-218张票
Thread-1...这是第-218张票
Thread-1...这是第-219张票
Thread-0...这是第-220张票
Thread-1...这是第-221张票
Thread-0...这是第-222张票
Thread-1...这是第-223张票

为什么会出现负数的情况?

答:当Thread0的number运行到number==0时,再继续往下运行到sleep,此时Thread0睡觉,Thread1运行到sleep睡觉,知道Thread3运行到sleep睡觉后,此时Thread0醒来,继续循环,就会出现负数情况

为什么出现Thread0和Thread1都有相同的票数?

答:因为没有同步线程代码块。

改进代码:

package 线程;

public class RunnableTicket {
    public static void main(String[] args) {
        Mythread mythread = new Mythread();
        new Thread(mythread).start();
        new Thread(mythread).start();
        new Thread(mythread).start();
        new Thread(mythread).start();
    }
}

class Mythread implements Runnable {
    private int number = 100;

    @Override
    public void run() {
        while (true) {
            synchronized (this) {
                if (number == 0) {
                    break;
                }
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "...这是第" + number-- + "张票");
            }
        }
    }
}

运行结果

Thread-0...这是第100张票
Thread-0...这是第99张票
Thread-0...这是第98张票
Thread-0...这是第97张票
Thread-0...这是第96张票
Thread-0...这是第95张票
Thread-0...这是第94张票
Thread-0...这是第93张票
Thread-0...这是第92张票
Thread-0...这是第91张票
Thread-0...这是第90张票
Thread-0...这是第89张票
Thread-0...这是第88张票
Thread-0...这是第87张票
Thread-0...这是第86张票
Thread-0...这是第85张票
Thread-0...这是第84张票
Thread-0...这是第83张票
Thread-0...这是第82张票
Thread-0...这是第81张票
Thread-0...这是第80张票
Thread-0...这是第79张票
Thread-0...这是第78张票
Thread-0...这是第77张票
Thread-0...这是第76张票
Thread-0...这是第75张票
Thread-0...这是第74张票
Thread-0...这是第73张票
Thread-0...这是第72张票
Thread-0...这是第71张票
Thread-0...这是第70张票
Thread-0...这是第69张票
Thread-0...这是第68张票
Thread-0...这是第67张票
Thread-0...这是第66张票
Thread-0...这是第65张票
Thread-0...这是第64张票
Thread-0...这是第63张票
Thread-0...这是第62张票
Thread-0...这是第61张票
Thread-0...这是第60张票
Thread-0...这是第59张票
Thread-0...这是第58张票
Thread-0...这是第57张票
Thread-0...这是第56张票
Thread-0...这是第55张票
Thread-0...这是第54张票
Thread-0...这是第53张票
Thread-0...这是第52张票
Thread-0...这是第51张票
Thread-0...这是第50张票
Thread-0...这是第49张票
Thread-0...这是第48张票
Thread-0...这是第47张票
Thread-0...这是第46张票
Thread-0...这是第45张票
Thread-0...这是第44张票
Thread-0...这是第43张票
Thread-0...这是第42张票
Thread-0...这是第41张票
Thread-0...这是第40张票
Thread-0...这是第39张票
Thread-0...这是第38张票
Thread-0...这是第37张票
Thread-0...这是第36张票
Thread-0...这是第35张票
Thread-0...这是第34张票
Thread-0...这是第33张票
Thread-0...这是第32张票
Thread-0...这是第31张票
Thread-0...这是第30张票
Thread-0...这是第29张票
Thread-0...这是第28张票
Thread-0...这是第27张票
Thread-0...这是第26张票
Thread-2...这是第25张票
Thread-2...这是第24张票
Thread-2...这是第23张票
Thread-2...这是第22张票
Thread-2...这是第21张票
Thread-2...这是第20张票
Thread-2...这是第19张票
Thread-2...这是第18张票
Thread-2...这是第17张票
Thread-2...这是第16张票
Thread-2...这是第15张票
Thread-2...这是第14张票
Thread-2...这是第13张票
Thread-2...这是第12张票
Thread-2...这是第11张票
Thread-2...这是第10张票
Thread-2...这是第9张票
Thread-2...这是第8张票
Thread-2...这是第7张票
Thread-2...这是第6张票
Thread-2...这是第5张票
Thread-2...这是第4张票
Thread-2...这是第3张票
Thread-2...这是第2张票
Thread-2...这是第1张票

重点:
synchronized的参数可以时this,因为在主线程中之创建了一个Mythread对象,所以

-----------------------------------------------------------------------------------------------------------

另外,有同学想可以用

Mythread mythread = new Mythread();
Thread thread = new Thread(mythread);         
thread.start();
thread.start();
thread.start();
thread.start();

如上形式来启动线程,这是会报错的。

原因:

因为只new出了一个对象,一个对象多次启动线程是非法的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值