zoukankan      html  css  js  c++  java
  • 线程的【生命周期】和【线程的同步】(下面有多窗口售票例子)

    基础知识点:

     JDK 中用Thread.State 类定义了线程的几种状态
    要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类
    及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的 五
    种状态:


    新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建
    状态


    就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已
    具备了运行的条件,只是没分配到CPU资源


    运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态, run()方法定义了线
    程的操作和功能


    阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出 CPU 并临时中
    止自己的执行,进入阻塞状态


    死亡:线程完成了它的全部工作或线程被提前强制性地中止或出现异常导致结束

     

     

     

    解决方法:

    /**
    * 例子:创建三个窗口卖票,总票数为100张.使用实现Runnable接口的方式
    *
    * 1.问题:卖票过程中,出现了重票、错票 -->出现了线程的安全问题
    * 2.问题出现的原因:当某个线程操作车票的过程中,尚未操作完成时,其他线程参与进来,也操作车票。
    * 3.如何解决:当一个线程a在操作ticket的时候,其他线程不能参与进来。直到线程a操作完ticket时,其他
    * 线程才可以开始操作ticket。这种情况即使线程a出现了阻塞,也不能被改变。
    *
    *
    * 4.在Java中,我们通过同步机制,来解决线程的安全问题。
    *
    * 方式一:同步代码块
    *
    * synchronized(同步监视器){
    * //需要被同步的代码
    *
    * }
    * 说明:1.操作共享数据的代码,即为需要被同步的代码。 -->不能包含代码多了,也不能包含代码少了。
    * 2.共享数据:多个线程共同操作的变量。比如:ticket就是共享数据。
    * 3.同步监视器,俗称:锁。任何一个类的对象,都可以充当锁。
    * 要求:多个线程必须要共用同一把锁。
    *
    * 补充:在实现Runnable接口创建多线程的方式中,我们可以考虑使用this充当同步监视器。
    * 方式二:同步方法。
    * 如果操作共享数据的代码完整的声明在一个方法中,我们不妨将此方法声明同步的。
    *
    *
    * 5.同步的方式,解决了线程的安全问题。---好处
    * 操作同步代码时,只能有一个线程参与,其他线程等待。相当于是一个单线程的过程,效率低。 ---局限性
    *
    * @author ch
    * @create 2019-02-13 下午 4:47
    */
    class Window1 implements Runnable{
    
        private int ticket = 100;
    //    Object obj = new Object();
    //    Dog dog = new Dog();
        @Override
        public void run() {
    //        Object obj = new Object();
            while(true){
                synchronized (this){//此时的this:唯一的Window1的对象   //方式二:synchronized (dog) {
    
                    if (ticket > 0) {
    
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                        System.out.println(Thread.currentThread().getName() + ":卖票,票号为:" + ticket);
    
    
                        ticket--;
                    } else {
                        break;
                    }
                }
            }
        }
    }
    
    
    public class WindowTest1 {
        public static void main(String[] args) {
            Window1 w = new Window1();
    
            Thread t1 = new Thread(w);
            Thread t2 = new Thread(w);
            Thread t3 = new Thread(w);
    
            t1.setName("窗口1");
            t2.setName("窗口2");
            t3.setName("窗口3");
    
            t1.start();
            t2.start();
            t3.start();
        }
    
    }
    不积跬步,无以至千里;不积小流,无以成江海。
  • 相关阅读:
    CSS+HTML+flexible.js+rem实现屏幕缩放适配概念原理解释
    《写给程序员的Python教程》阅读随笔---python禅学(Zen_of_python)
    Python使用sql语句对mysql数据库多条件模糊查询
    request.json和request.form
    Python的flask接收前台的ajax的post数据和get数据
    Echarts世界地图和网页表格数据交互联动
    团队项目简介
    ajax和flask路由传json格式数据出现undefined和object错误
    世界疫情div界面搭建初步
    解决element-ui DateTimePicker 默认日期格式化问题
  • 原文地址:https://www.cnblogs.com/CCTVCHCH/p/14645206.html
Copyright © 2011-2022 走看看