• 多线程相关


    1.线程的状态

    • 新建状态,当new一个线程时,线程就属于新建状态。线程创建的几种方法:

              方法1:

    public class ThreadCreat{
    
        //Runnable接口是专门用来创建线程的执行体的。
        public void creatThread(){
            Thread thread=new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("this a new thread");
                }
            });
    
        }
    
    }

             方法2:新建一个类继承Thread类,Thread类本身实现了Runnable接口,可以通过继承重写Thread类的run方法(实现Runnable接口而来)来写线程的执行体, 然后实例化这个新建的类来新建一个线程;

    • 就绪状态:thread.start();此时线程处于就绪状态,可以等待cpu调度来执行(并不是说start完就一定会立刻执行,一个线程对象只能start一次);
    • 运行状态:来cpu来调度线程执行时线程处于运行状态;
    • 阻塞状态:线程由于某种原因放弃了cpu的使用权停止运行,此时处于阻塞状态。直到它重新处于就绪状态才可以重新运行。根据阻塞的原因的不同,阻塞状态也分为几种:                 

                             1.同步阻塞(想要获得锁资源得不到)。

                             2.调用sleep()方法进入睡眠直到超过睡眠时间。

                             3.等待阻塞(调用线程的wait()方法)此次需要其他线程来唤醒

    • 死亡状态:线程执行完了或者出现异常退出。

    2.线程池

    • 线程池的作用:每来一个任务都要新建一个线程的话很消耗资源,很可能会耗尽内存。于是使用线程池。可以用线程池重用线程,控制并发数量。
    • 线程池的结构

    worker :每个worker拥有一个线程。可以设置线程池中线程的个数(有核心线程数和最大线程数)。当任务多于线程池的核心线程个数时(在这之前每有一个任务就新建一个线程)就会在队列里排队。等待worker去队列中拉取任务并执行。线程池的线程也有一定的线程存活时间,(当暂时没有任务了总不能一直让线程在那占用资源啊)

    • 线程池的参数:     线程池的核心线程数:超过核心线程数就到队列里等待

                             线程池的最大线程数:当队列满了就新建线程,不能超过最大线程数

                             线程池的线程空闲存活时间:当线程数大于核心线程时,停止超过空闲时间的线程

                             线程池线程工厂

                             线程池的任务队列:ArrayBlockingQueue有界队列,LinkedBlockingQueue无界队列,同步队列SynchronousQueque(没有容量,有任务必须立刻执行  或者拒绝,所以同步),优先级队列RriorityBockingQueque(无界)

    • 任务拒绝策略(当线程数达到了最大线程数且队列满拒绝处理):1.抛弃不抛出异常2.抛弃不抛出异常3.抛弃队头的任务4.由当前线程执行

    3.线程池java实现的接口和类

    顶层Executor接口,

    继承了Executor的ExecutorService接口,

    实现了ExecutorService的AbstractExecutorService类,

    继承了AbstractExecutorService的ExecutorThreadPool。

    4.几种ThreadPool类型

    方法  描述和特点
    Executors.newCachedThreadPool(); 创建一个线程池,缓冲池容量大小为Integer.MAX_VALUE。可以让任务立刻执行,也可重用线程,但是不能控制并发数
    Executors.newSingleThreadExecutor();  创建容量为1的线程池,无界队列,可以让任务按顺序执行
    Executors.newFixedThreadPool(int); 创建固定容量大小的线程池,可以控制并发数,重用线程

      实际上可以使用ThreadPoolExecutor的构造方法配置参数实现自己想要的线程池。
     
  • 相关阅读:
    [抄书]The Pipes and Filters pattern
    [抄书]The Layers pattern
    OpenGL Step by Step (1)
    [HOOPS]二维点向三维空间投影
    心仪已久的工具:BoundsChecker v7.2
    [HOOPS]用HC_Show_...获取正确的点的坐标位置
    小试zlib
    XML (2) Document Type Definitions (DTD)
    UML (1) 设计模式及作业附图
    XML (1) 什么是XML
  • 原文地址:https://www.cnblogs.com/cai-cai777/p/10886265.html
Copyright © 2020-2023  润新知