多线程

作者: 崽子猪 | 来源:发表于2019-05-23 21:35 被阅读0次

    一.多线程的创建

    1.thread / runnable

          1>继承thread类 并重写run方法

    继承Thread

    启动线程 Thread

           2>实现Runnable接口 同时实现run方法


    实现Runnable接口 启动线程 Runnable

    2.两种启动线程方法的异同点

        共同点: 都必须调用Thread产生线程 调用start方法开启线程

        不同点: 1>接口比继承Thread更灵活 

                      2> 如果继承Thread类,就必须产生相应多个Thread线程

                            而实现Runnable接口只需要建立一个实现这个类的实例,然后用这个实例对象产生多个线程,就可以实现整个资源的共享


    3.start方法和run方法的区别(开启线程的方法)

       start:启动了线程真正实现了多线程执行体,不需要等到run方法执行完毕,就可以执行下面的代码

       run:处于就绪状态的,并没有进行运行

       run方法其实就是一个线程体,包含了线程主要要执行的内容

       run方法结束的话这个线程就终止了

       单独调用run方法只会正常顺序执行,没有实现多线程的效果


    二.多线程的通信方式

        1.synchronized关键字

            1>synchronized对象锁

    synchronized对象锁

           2>synchronized实现线程间通信(通过不同的线程,去共享同一个变量,来进行锁的管理)

    共享内存通信

            3>synchronized/volatile

    各种修饰符

              4>synchronized(CPU悲观锁机制,是一个独占的锁意味着其他线程只能依靠阻塞,来等待线程释放锁)/lock(CPU乐观锁机制, 每次不加锁而是假设没有冲突完成木架操作.如果有冲突失败就重试,直到成功为止)

    2.sleep / wait

              

    [sleep]在设定的时间内,阻塞线程的执行,但不会改变线程锁的持有情况)[wait]需要锁来控制

    3.wait / notify通信机制

               

    [wait]定义在object大量当中,需要在同步代码块当中来调用.调用完之后才会释放锁.并进入锁对象的等待队列

    [notify] 需要其他线程来调用此方法释放锁之后他才能去重新竞争这个锁

    [notifyAll] 通知所有线程去释放锁


    三.线程池

        1>好处

            1.降低资源消耗(就是说我们可以通过重复利用已经创建的线程,降低线程创建,销毁锁带来的消耗)

            2.提高响应速度(当我们的任务达到一定数量程度的时候,不需要等到线程创建就立即执行)

            3.提高线程的可管理性(因为线程毕竟还是比较稀缺的资源,尤其是在手机当中.可无限式的创建线程,不仅会消耗系统资源,同时还会降低系统稳定性,使用线程池进行统一分配,这样我们不仅做到了合理利用线程池,同时也提高了我们线程池的管理性)

        2>ThreadPoolExecutor

                 new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,milliseconds,runnableTaskQueue,handler);

        corePoolSize:线程池的基本大小

        maximumPoolSize:线程池最大容量的线程大小

        keepAliveTime:内存活动保存的时间

        milliseconds:保证时间的单位

        runnableTaskQueue:阻塞队列

        ThreadFactory:创建线程的工厂

        RejectedExecutionHander:是一个保护策略.(当线程满的时候直接抛出异常)

        创建线程池 ---> 提交任务 

      3>线程池的工作流程

            1)首先线程池判断基本线程池是否已满[如果满的话,进行下一个流程.如果没满会创建一个工作线程执行该任务]

            2)其次线程池判断工作队列是否已满[如果满的话,进行下一个流程,如果没满我们将提交一个任务存储到该工作队列当中]

            3)线程池判断整个线程池是否已满[如果满的话,进行下一个流程,如果没满抛出异常]

    相关文章

      网友评论

          本文标题:多线程

          本文链接:https://www.haomeiwen.com/subject/kglizqtx.html