[关闭]
@File 2020-04-09T14:34:04.000000Z 字数 3095 阅读 122

java 多线程和线程池

java web


线程生命周期

一、创建线程

1. 继承 Thread 类

  1. public class MyThread extends Thread {
  2. @Override
  3. public void run() {
  4. // 业务逻辑
  5. }
  6. /**
  7. * 模拟调用
  8. */
  9. public static void main(String[] args) {
  10. MyThread myThread = new MyThread();
  11. // 启动线程
  12. myThread.start();
  13. }
  14. }

2. 实现 Runnable 接口

  1. public class MyRunnable implements Runnable{
  2. @Override
  3. public void run() {
  4. // 业务逻辑
  5. }
  6. /**
  7. * 模拟调用
  8. */
  9. public static void main(String[] args) {
  10. // 吧 Runnable 实现类的实例作为参数实例化 Thread
  11. MyRunnable runnable = new MyRunnable();
  12. Thread thread = new Thread(runnable);
  13. // 启动线程
  14. thread.start();
  15. }
  16. }

二、线程常用方法

1. start() 启动线程

  1. Thread thread = new Thread();
  2. thread.start();

2. join() 等待线程

  1. // 启动了某个线程
  2. thread.start();
  3. // 等待上面的线程结束后再往下执行
  4. thread.join();

3. isInterrupted() 是否已中断

  1. thread.isInterrupted();

4. currentThread() 查看当前线程信息

  1. // 查看线程id
  2. Thread.currentThread().getId()
  3. // 查看线程名称
  4. Thread.currentThread().getName()

5. sleep() 线程延时

  1. // 方法一:延时 1000 毫秒
  2. Thread.sleep(1000)
  3. // 方法二:延时 1 秒
  4. TimeUnit.SECONDS.sleep(1);

6. synchronized 同步锁

  1. // 锁类
  2. public class synchronized Demo {
  3. // 锁对象方法
  4. public synchronized test() {
  5. // 锁对象业务块
  6. synchronized(this){}
  7. }
  8. // 锁类方法
  9. public synchronized static test() {
  10. // 锁类业务块
  11. synchronized(Demo.class){}
  12. }
  13. }

三、线程池

1. 通过 ThreadPoolExecutor 创建线程

  1. /**
  2. * 创建线程池
  3. * @param int corePoolSize 核心线程数
  4. * @param int maximumPoolSize 最大线程数
  5. * @param long keepAliveTime 空闲线程存活时间
  6. * @param TimeUnit unit 时间单位
  7. * @param BlockingQueue<Runnable> workQueue 任务队列
  8. * @param ThreadFactory threadFactory 线程创建的方式
  9. * @param RejectedExecutionHandler handler 拒绝策略
  10. */
  11. ThreadPoolExecutor pool = new ThreadPoolExecutor(5, 8, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5));
  12. // 提交任务
  13. pool.execute(() -> {
  14. // 任务逻辑
  15. });

2. 通过 Executors 静态创建线程池

2.1 newSingleThreadExecutor 单线程的线程池

  1. Executors.newSingleThreadExecutor();

2.2 newFixedThreadExecutor 固定大小的线程池

  1. Executors.newFixedThreadExecutor();

2.3 newCacheThreadExecutor 可缓存的线程池

  1. Executors.newCacheThreadExecutor();

2.4 newScheduleThreadExecutor 无限大的线程池

  1. Executors.newScheduleThreadExecutor();

3. 通过 ScheduledThreadPoolExecutor 创建线程

  1. // 创建大小为2的线程池
  2. ScheduledExecutorService pool = new ScheduledThreadPoolExecutor(2);
  3. // 5秒后执行的任务
  4. pool.schedule(() -> {
  5. // 任务逻辑
  6. }, 5, TimeUnit.SECONDS);
  7. // 相隔2秒执行一次的任务
  8. pool.schedule(() -> {
  9. // 任务逻辑
  10. }, 0, 2, TimeUnit.SECONDS);

四、线程池常用方法

1. submit() | execute() 提交任务

2. shutdown() 停止线程池

3. shutdownNow() 立即停止线程池

4. isShutdown() 是否正在关闭线程池

5. isTerminated() 是否已经关闭线程池

6. awaitTermination() 等待线程关闭

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注