zoukankan      html  css  js  c++  java
  • 多线程(一)

    说起多线程不得不弄清几个“词”的含义:

    进程:顾名思义就是正在执行中的程序,为了完成某个特定的任务、功能,而用某种编程语言编写的一组指令的集合。

    线程:在操作系统中,进程是资源分配、调度和管理的最小单位。每个进程在内存中是独立的。

    进程与线程之间的关系:线程是进程中的一条执行路径。

    那么怎么开启线程哪?

    a:继承 thread 类

    b:实现 runnable接口

    a方式的代码如下:

    // 方式一:继承Thread类
    class MyThreadMethod1 extends Thread {
        private static int ticket = 10;
    
        // 重写run方法:
        public void run() {
            while (true) {
                if (ticket > 0) {// 提升效率
                    synchronized (MyThreadMethod1.class) {// 保证线程安全。
                        if (ticket > 0) {
                            System.out.println(getName() + "票数:" + ticket);
                            ticket--;
                        }
                    }
                } else {
                    break;
                }
            }
        }
    }
    //测试方式一:
        @Test
        public void test() {
            // 定义3个线程
            MyThreadMethod1 t1 = new MyThreadMethod1();
            MyThreadMethod1 t2 = new MyThreadMethod1();
            MyThreadMethod1 t3 = new MyThreadMethod1();
    
            t1.start();
            t2.start();
            t3.start();
        }

    b:方式的代码如下:

    // 方式二:实现Runnable接口,重写run方法
    class MyThreadMethod2 implements Runnable {
        private static int ticket = 10;
        @Override
        public void run() {
            while (true) {
                if (ticket > 0) {
                    synchronized (MyThreadMethod2.class) {
                        if (ticket > 0) {
                            System.out.println(Thread.currentThread().getName() + "票数:" + ticket);
                            ticket--;
                        }
                    }
                }
            }
        }
    
    }
    //测试方式二:
        /**
         * 代理者模式的思想:
         * 测试:由于实现runnable接口后,并没有start方法,所以不能使用对象调用start()
         *     可以使用代理者模式,因为Thread和本类都实现了相同的接口runnable接口,
         *     使两者遵守同样的规范。
         *     代理者持有被代理者的引用。
         *     核心代码仍然需要被代理者本身去做,其他的一些问题可以交给代理者来做。
         *     
         *     本次的代理者与被代理者:
         *     代理者:Thread     要持有被代理者的引用
         *     被代理者:MyThreadMethod2
         * 
         */
        @Test
        public void test2() {
            
            // 定义3个线程:并且代理者持有被代理者的引用
            Thread t1 = new Thread(new MyThreadMethod2());
            Thread t2 = new Thread(new MyThreadMethod2());
            Thread t3 = new Thread(new MyThreadMethod2());
            //开启线程
            t1.start();
            t2.start();
            t3.start();
                
        }

    继承Thread和实现Runnable接口的区别:

    继承Thread的优点:

             代码简洁。

    实现Runnable接口的优势:

           1.避免了单继承的局限性。

            2.多个线程可以共享同一个接口子类的对象target,非常适合多个相同线程来处理同一份资源

    线程的生命周期:

    新建:当一个Thread类的对象或子类对象被创建,此时的线程的状态称为"新建"。

    就绪:当Thread类的对象或子类对象调用start()的时候,将进入线程队列等待CPU时间片,此时它已具备了运行的条件,此时线程的状态称为"就绪"状态。

    运行:当就绪的线程被CPU调用,并获得资源时,此时进入"运行"的状态,执行的内容是定义的run()里面的定义的内容。

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

    消亡:线程完成了它的全部工作,或则被提前强制停止。

    注意:由于stop的方法已经过时,建议谨慎使用,停止线程,可以定义一个标志状的标记符,根据标识符的状态来改变进程的状态。

  • 相关阅读:
    MQTT的优势
    http与https与tcp区别
    中科芯CKS-MBT30数据采集网关帮助工程师实现PLC远程上下载,减少出差成本
    CKS-MAT30远程程序上下载 支持欧姆龙西门子等PLC 远程下载、监控
    西门子S7以太网通讯协议
    DK云网关与普通DTU之间的区别
    腾讯笔试题
    二叉搜索树
    哈希,链接法解决冲突
    将16进制字符串转化为10进制数输出
  • 原文地址:https://www.cnblogs.com/donghaibin/p/9157590.html
Copyright © 2011-2022 走看看