当前位置 博文首页 > 范栩的博客:多线程笔记

    范栩的博客:多线程笔记

    作者:[db:作者] 时间:2021-08-31 09:49

    多线程

    程序、进程、线程

    • 在操作系统运行的应用就是进程。
    • 一个进程(Process)可以有多个线程(Thread)
    • 程序跑起来就是进程
    • 真正跑起来的是线程

    很多多线程是模拟出来的,需要多核的cpu才能执行多线程

    • 线程就是独立的执行路径;
    • 在程序运行时,及时没有自己创建线程,后台也会有多个线程,例如主线程(main),gc线程;
    • main()称之为主线程,为系统的入口,用于执行整个程序;
    • 一个进程中如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的。
    • 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;
    • 线程会带来额外的开销、如cpu调度时间,并发控制开销。
    • 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致。

    Runnable和Thread

    • 继承了Thread类就需要重写run方法
    • 实现了Runnable也是要写run方法的

    Thread类也是实现了Runnable的

    一般使用Runnable,方便继承多个接口。

    Lambda表达式

    new Thread(()-> System.out.println("我爱你")).start();
    

    为什么要使用Lambda表达式

    • 避免内部类使用过多。
    • 可以让你的代码看上去很简洁。
    • 去掉了一堆没有意义的代码,只留下核心的逻辑。

    函数式接口

    • 任何一个接口,如果只包含一个抽线方法,那么它就是一个函数式接口。
    • 对于函数式接口,我们可以通过Lambda表达式来创建该接口的对象
    //函数式接口
    public interface Runnable {
        /**
         * When an object implementing interface <code>Runnable</code> is used
         * to create a thread, starting the thread causes the object's
         * <code>run</code> method to be called in that separately executing
         * thread.
         * <p>
         * The general contract of the method <code>run</code> is that it may
         * take any action whatsoever.
         *
         * @see     java.lang.Thread#run()
         */
        public abstract void run();
    }
    
    

    线程的五大状态

    创建状态

    就绪状态

    阻塞状态

    运行状态

    死亡状态

    停止线程

    • 推荐使用标志位,让线程自己停下来——>利用次数,不建议用死循环。
    • 不要使用stop或者destroy等过时的方案

    线程优先级(Priority)

    getPriority() //查看优先级
    setPriority() //设置优先级
    

    守护(daemon)线程

    • 线程分为用户线程守护线程
    • 虚拟机必须确保用户线程执行完毕
    • 虚拟机不用等待守护线程执行完毕,例如:后台记录操作日志,监控内存,垃圾回收等待

    线程同步(重点)

    多个线程操作同一个资源

    并发同一个对象多个线程操作

    处理多线程问题的时候,需要线程同步,线程同步其实就是一种等待机制,多个想要访问此对象的线程进入该对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用。

    形成条件:队列+锁(synchronized)

    cs
    下一篇:没有了