• Java 多线程Thread和Runnable


    Thread:

    class MyThread extends Thread
    {
        private int ticketsCont=5; //一共有5张火车票
    
        private String name; //窗口, 也即是线程的名字
    
        public MyThread(String name){
            this.name=name;
        }
    
        @Override
        public void run(){
    
            while(ticketsCont>0){
                ticketsCont--; //如果还有票,就卖掉一张票
                System.out.println(name+"卖掉了1张票,剩余票数为:"+ticketsCont);
            }
    
        }
    }
    
    public class TicketsThread
    {
        public static void main(String args[]){
    
            //创建三个线程,模拟三个窗口卖票
            MyThread mt1=new MyThread("窗口1");
            MyThread mt2=new MyThread("窗口2");
            MyThread mt3=new MyThread("窗口3");
    
            //启动三个线程,也即是窗口,开始卖票
            mt1.start();
            mt2.start();
            mt3.start();
    
        }
    }
    窗口1卖掉了1张票,剩余票数为:4
    窗口1卖掉了1张票,剩余票数为:3
    窗口1卖掉了1张票,剩余票数为:2
    窗口1卖掉了1张票,剩余票数为:1
    窗口1卖掉了1张票,剩余票数为:0
    窗口3卖掉了1张票,剩余票数为:4
    窗口2卖掉了1张票,剩余票数为:4
    窗口3卖掉了1张票,剩余票数为:3
    窗口3卖掉了1张票,剩余票数为:2
    窗口3卖掉了1张票,剩余票数为:1
    窗口3卖掉了1张票,剩余票数为:0
    窗口2卖掉了1张票,剩余票数为:3
    窗口2卖掉了1张票,剩余票数为:2
    窗口2卖掉了1张票,剩余票数为:1
    窗口2卖掉了1张票,剩余票数为:0
    View Code

    Runnable接口:

    class MyThread2 implements Runnable
    {
        private int ticketsCont=5; //一共有5张火车票
    
        @Override
        public void run(){
            while(true){
                synchronized(this){
                    if(ticketsCont<=0){
                        break;
                    }
                    ticketsCont--; //如果还有票,就卖掉一张票
    
                    System.out.println(Thread.currentThread().getName()+"卖掉了1张票,剩余票数为:"+ticketsCont);
    
                        /*try{
                            Thread.sleep(50);  //通过阻塞程序来查看效果
                        }
                        catch(Exception e){
                            System.out.println(e);
                        }*/
                }
            }
    
        }
    }
    
    public class TicketsRunnable
    {
        public static void main(String args[]){
    
            MyThread2 mt=new MyThread2();
            //创建三个线程来模拟三个售票窗口
            Thread th1=new Thread(mt,"窗口1");
            Thread th2=new Thread(mt,"窗口2");
            Thread th3=new Thread(mt,"窗口3");
    
            //启动三个线程,也即是三个窗口,开始卖票
            th1.start();
            th2.start();
            th3.start();
        }
    }
    窗口1卖掉了1张票,剩余票数为:4
    窗口1卖掉了1张票,剩余票数为:3
    窗口1卖掉了1张票,剩余票数为:2
    窗口1卖掉了1张票,剩余票数为:1
    窗口1卖掉了1张票,剩余票数为:0
    View Code

    修改MyThread2

    class MyThread2 implements Runnable
    {
        private int ticketsCont=5; //一共有5张火车票
        @Override
        public void run() {
            while (true) {
                if (ticketsCont <= 0) {
                    break;
                }
                ticketsCont--; //如果还有票,就卖掉一张票
                System.out.println(Thread.currentThread().getName() + "卖掉了1张票,剩余票数为:" + ticketsCont);
            }
        }
    }
    窗口1卖掉了1张票,剩余票数为:3
    窗口3卖掉了1张票,剩余票数为:2
    窗口2卖掉了1张票,剩余票数为:3
    窗口3卖掉了1张票,剩余票数为:0
    窗口1卖掉了1张票,剩余票数为:1
    View Code

    Thread类是多个线程分别完成自己的任务,Runnable是多个线程共同完成一个任务。

    建议使用Runnable这种方式创建线程。 程序中的同一资源指的是同一个Runnable对象。安全的卖票程序中需要加入同步synchronized。

    http://www.cnblogs.com/Li-Cheng/p/4332179.html

  • 相关阅读:
    (转)社会青年应如何自学英语?
    WEB标准学习路程之"CSS":13.声明,单位
    8大致命生活毛病(转)
    VS2008小Bug??
    【细嚼慢咽大数据】第一章——数据挖掘基本概念,邦弗朗尼原理,IF.IDF指标,哈希函数
    【Linux操作系统分析】定时测量——RTC,TSC,PIT,jiffies,计时体系结构,延迟函数
    【Git】Git上传本地项目的命令以及nonfastforward updates were rejected的解决办法
    【Linux操作系统分析】Ubuntu12.04内核升级和添加系统调用
    【折腾ubuntu】Ubuntu12.04安装windows版本的福昕阅读器
    【二】zTree checkbox
  • 原文地址:https://www.cnblogs.com/hongdada/p/6093985.html
Copyright © 2020-2023  润新知