zoukankan      html  css  js  c++  java
  • java基础之多线程一:概述

    概述: 进程有多条执行路径, 合成为: 多线程.
        进程和线程的描述:
            进程:     
                可执行程序(文件), 例如: .exe//可以把进程理解为一辆车.
                一台电脑上可以有多个进程, 这些进程之间的数据是相互隔离的.//例如: qq.exe,  wechat.exe
            线程: 
                线程是进程的执行路径(执行单元)//可以把线程理解为: 是马路
                一个进程可以有多条线程, 这些线程可以共享该进程的数据.//例如: 往QQ群共享放一个文件, 该群中的所有的用户都可以下载.    
            进程依托于系统,线程依托于CPU
            
    多线程并行和并发的区别:
        并行: 两个(多个)线程同时执行.     //前提: 需要多核CPU
        
        并发: 
            两个(多个)线程同时请求执行, 但是CPU同一瞬间只能执行一个线程,
            于是就安排这些线程交替执行, 因为时间间隔非常短, 我们看起来好像是同时执行的, 其实不是.
            
    多线程的实现方式: 链接
        方式一: 继承Thread类.
            步骤:
                1) 定义一个类(MyThread), 继承Thread类.
                2) 重写Thread#run(). //重写Thread类中的run()方法.
                3) 把要执行的代码放入run()方法中.
                4) 在测试类中,创建线程对象.
                5) 开启线程.  //start()
                
                好处: 代码相对比较简单.        //因为是继承Thread类, 所以可以直接使用Thread类中的非私有成员.
                弊端: 扩展性相对较差.        //因为是继承, 而Java中类之间的继承只能单继承, 不能多继承, 但是可以多层继承.
                
                注意事项:
                    A: 如果调用run()方法, 只是普通的方法调用.
                    B: 开启线程必须调用start()方法, 该方法会自动去调用run()方法.            
                    C: 同一线程不能重复开启, 否则会报: IllegalThreadStateException异常.
        
        方式二: 实现Runnable接口.
            步骤:
                1) 定义一个类(MyRunnable), 实现Runnable接口.
                2) 重写Runnable#run().
                3) 把要执行的代码放入run()方法中.
                4) 在测试类中, 创建Runnable接口的子类对象, 
                    MyRunnable mr = new MyRunnable();
                   并将其作为参数传入Thread类的构造, 创建线程对象.
                    Thread th = new Thread(mr);
                5) 开启线程.    //start()
                
                好处: 扩展性相对较强.
                弊端: 代码相对比较 繁琐.
        
        方式三: 结合线程池使用(实现Callable接口).
    
    Thread类中的成员:
        构造方法:
            public Thread();
            public Thread(String name);
            public Thread(Runnable target);
            public Thread(Runnable target,String name);
            
        
        成员方法:
            run();              //里边定义的是线程要执行的代码, 该方法会自动被start()方法调用.
            start();            //开启线程, 会自动调用run().
            getName();
            setName();
            sleep();            //休眠线程, 单位是: 毫秒.
            currentThread();    //获取当前正在执行的线程对象(的引用).
            
        
    多线程同步:  链接
        概述/作用:
            多线程(环境) 并发 操作同一数据, 有可能引发安全问题, 就需要用到同步解决.
        
        分类:
            同步代码块:
                格式:
                    synchronized(锁对象) {
                        //要加锁的代码
                    }
                锁对象:
                    1) 同步代码块的锁对象可以是任意类型的对象.
                    2) 必须使用同一把锁, 否则可能出现锁不住的情况.
            
            同步方法:
                静态方法:
                    锁对象: 该类的字节码文件对象.
                非静态方法:
                    锁对象: this
                    
    多线程的生命周期
        新建, 就绪, 运行(有可能会发生阻塞(系统控制) 或者 等待(可人为控制)状态), 死亡.
  • 相关阅读:
    统计脚本代码行数
    expr算术运算
    lsof命令
    测试当前机器可以创建多少线程
    守护进程写日志
    文件描述符fd,struct files_struct
    linux查看反汇编
    信号补充
    Windows10获取VS管理员权限总是很烦人
    asp.net中的Filter类型其实是被当作单例的
  • 原文地址:https://www.cnblogs.com/blazeZzz/p/9152645.html
Copyright © 2011-2022 走看看