多线程

一.多线程的创建

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)线程池判断整个线程池是否已满[如果满的话,进行下一个流程,如果没满抛出异常]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在前面的话: 这篇博客是我从这里“转载”的,为什么转载两个字加“”呢?因为这绝不是简单的复制粘贴,我花了五六个小...
    SmartSean阅读 10,218评论 12 45
  •   一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺...
    OmaiMoon阅读 5,631评论 0 12
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,060评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,186评论 1 15
  • 林炳文Evankaka原创作品。转载自http://blog.csdn.net/evankaka 本文主要讲了ja...
    ccq_inori阅读 3,865评论 0 4