线程的几种状态,四种常见的线程池的介绍

0. 什么是同步和有异步

同步:发送一个请求,等待返回,然后再发送下一个请求,线程和进程按照顺序依次运行

异步:发送一个请求,不等待返回,随时可以再发送下一个请求

同步可以避免死锁,异步可以提高效率

1. 线程的几种状态:

  1. 新建状态(new) : 新创建了一个线程对象

  2. 可运行状态 : 其他线程调用了这个线程的start()方法. 这个线程被放到可运行线程池中,等待获取CPU的使用权.

  3. 运行状态 : 就绪状态的线程获得了cpu的使用权,开始执行代码
  4. 阻塞状态 : 线程由于某些原因,放弃了cpu的使用权,暂停运行,直到线程重新进入就绪状态.
  5. 死亡状态 : 线程执行完毕或因为异常退出了run()方法
    image

2. 阻塞状态:

  1. 等待阻塞 :
    线程执行wait()方法,线程会释放占用的资源,在等待池中,等待其他线程调用notify()或notifyAll()方法重新唤醒,进入就绪状态

  2. 同步阻塞 :
    运行的线程在获取对象的同步锁时,其他线程获取了该锁标志,JVM会把这个线程放在锁池中.

  3. 其他阻塞:
    运行的线程执行了sleep()或join()方法,或发出了I/O请求,在sleep()超时,或join()所等待的线程执行终止后,或I/O处理完毕时,线程重新进入就绪状态

3. 使用线程池

  • 使用Executors工具类

作用:

减少创建和销毁线程的次数,每个工作线程可以多次使用
可根据系统情况调整执行的线程数量,防止消耗过多内存

常见的线程池对象

  1. newSingleThreadExecutor 单个线程的线程池

    扫描二维码关注公众号,回复: 2147531 查看本文章
  2. newFixedThreadExecutor(n) 固定数量的可重复的线程池, pool.execute(myThread)就是一个线程,直到达到线程池的最大数量,其他线程等待前面的任务完后后继续执行.

  3. newCacheThreadExecutor (推荐使用) 可缓存线程池,当任务较少的时候,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
  4. newScheduleThreadExecutor , 无限大的线程池,支持定时和周期执行线程
实例:
  • 新建一个类继承Thread , 并重写他的run()方法
package com.zgd.thread;

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "执行中。。。");
        super.run();
    }
}
  • 测试类
package com.zgd.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TreadPoolTest {

    public static void main(String[] args) {
//       single();
        fixed();
//        cached();
    }

    ...
    single();
    fixed();
    cached();
    ...
}
  • newSingleThreadExecutor 单个线程的线程池
public static void single(){
    //创建一个可重用固定线程数的线程池
    ExecutorService pool = Executors.newSingleThreadExecutor();
    for (int i = 0; i < 5; i++) {
        MyThread myThread = new MyThread();
        //创建一个新的线程对象,放在线程池中执行
        pool.execute(myThread);
    }
    //关闭线程池
    pool.shutdown();
}
  • newFixedThreadExecutor 可重复用固定数的线程池
public static void fixed(){
    // 创建一个可重用的固定线程数的线程池
    ExecutorService pool = Executors.newFixedThreadPool(5);
    for (int i = 0; i < 10; i++) {
        MyThread myThread = new MyThread();
        //将线程放到线程池中执行
        pool.execute(myThread);
    }
    // 关闭线程池
    pool.shutdown();
}
  • newCacheThreadExecutor 可自动变化大小的线程池
 public static void cached(){
    ExecutorService pool = Executors.newCachedThreadPool();
    for (int i = 0; i < 20; i++) {
        MyThread myThread = new MyThread();
        //将线程放到线程池中执行
        pool.execute(myThread);
    }
    // 关闭线程池
    pool.shutdown();
}

猜你喜欢

转载自blog.csdn.net/zzzgd_666/article/details/80804638