• 你选择哪一种方式创建线程?


    抛开线程池不说,创建线程有两种方式

    创建线程的第一种方式:

    1. 创建一个类继承Thread
    2. 重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置。)
    3. 创建子类对象,其实就是在创建线程
    4. 启动线程start()

    这种方式的特点(缺陷):线程任务和线程是绑定在一起的。

    示例:

    四个窗口同时卖票,

    因为是同时,所以使用多线程。

    创建四个线程,都是卖票。

    因为都是卖票,所以四个线程的任务是一样的。

    只需要定义一个类继承Thread。

    class Ticket extends Thread
    {
        private static int num = 50; //定义成static,四个线程共享50张票。
        public void run()
        {
            while(num>0)
            System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
        }
    }
    
    class Maipiao
    {
        public static void main(String[] args) 
        {
            Ticket win1 = new Ticket();
            Ticket win2 = new Ticket();
            Ticket win3 = new Ticket();
            Ticket win4 = new Ticket();
    
            win1.start();
            win2.start();
            win3.start();
            win4.start();
        }
    }
    

     这种方式创建线程不可取,为什么呢?作比较,往下看

     创建线程的第二种方式:

    1. 创建实现了Runnable接口的子类
    2. 重写Runnable接口中的run方法
    3. 创建实现了Runnable接口的子类的对象
    4. 创建Thread类的对象,也就是在创建线程
    5. 把实现了Runnable接口的子类对象作为参数传递给Thread类的构造方法

    这种方式的特点是:把线程任务进行了描述,也就是面向对象,从而实现了线程任务和线程对象的分离。线程执行什么任务不再重要,只要是实现了Runnable接口的子类对象都可以作为参数传递给Thread的构造方法,此方式较为灵活。

    第二种方式还有一个好处是实现接口了,还不影响继承其他父类。

    //这个类只是为了描述线程的任务,跟线程没有任何关系。
    class Ticket implements Runnable
    {
        private int num = 50; 
        public void run()
        {
            while(num>0)
            System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
        }
    }
    
    class Maipiao
    {
        public static void main(String[] args) 
        {
            Ticket t = new Ticket();
            
            Thread win1 = new Thread(t);
            Thread win2 = new Thread(t);
            Thread win3 = new Thread(t);
            Thread win4 = new Thread(t);
    
            win1.start();
            win2.start();
            win3.start();
            win4.start();
        }
    }

    通过代码,总结得出:

    为什么创建线程的第二种方式可以解决卖票问题?

     第一种创建线程的方式:线程和线程任务是绑定在一起的,创建了4个线程就创建了4份资源。

     第二种创建线程的方式:线程和线程任务进行了分离,只需要创建一个任务,让4个线程分别去执行。

  • 相关阅读:
    收藏一个超牛的css平滑移动 jquery插件
    惊艳到不行啊,html5真的牛逼
    推荐可以代替Visio的HTML开发的作图工具:ProcessOn
    struts标签 展示富文本时遇到的问题。
    ECharts 大数据时代,重新定义数据图表的时候到了
    Xtrareport 实现交叉表数据重复显示的问题
    【转】ASP.NET程序中常用的三十三种代码
    How to find the Report Data tab in SSRS after closing it
    分享经验, 技术探讨, 共同学习.
    Reporting Services 在WIN7和2008下出现“授予的权限不足,无法执行此操作。 (rsAccessDenied)”的解决办法
  • 原文地址:https://www.cnblogs.com/xiaoming0601/p/6006979.html
Copyright © 2020-2023  润新知