线程池

62 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

线程池的基本使用

1.线程池基本使用

public class EveryOneTask {
    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
           Thread thread = new Thread(new Tasks());
           thread.start();
        }
    }
}
class Tasks implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+" 执行了任务");

    }
}

运行结果:
image.png

1.FixedThreadPool使用

package com.imooc.jedis;

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

public class FixedThreadPoolTest {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        for (int i = 0; i < 1000; i++) {
            executorService.execute(new Task());
        }
    }
}

class Task implements Runnable{

    @Override
    public void run() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(Thread.currentThread().getName());
    }
}

结果:
image.png

代码说明:

  • Task implements Runnable:线程实现Runnable类
  • ExecutorService executorService = Executors.newFixedThreadPool(4):创建newFixedThreadPool对象

3.FixedThreadPool出错情况

public class FixedThreadPoolOOM {
    public static void main(String[] args) {
      ExecutorService executorService =  Executors.newFixedThreadPool(1);
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            executorService.execute(new subThread());
        }
    }
}
class subThread implements Runnable{

    @Override
    public void run() {
        try {
            Thread.sleep(1000000000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(Thread.currentThread().getName());
    }
}

运行结果: image.png 代码说明:

  • Executors.newFixedThreadPool(1):线程设置成1
  • Thread.sleep(1000000000):执行时间尽可能长

4.newSingleThreadExecutor

newSingleThreadExecutor 是啥?这个线程池只有一个线程newSingleThreadExecutor() 方法可以创建一次执行单个任务的执行程序
public class SingleThreadExcutor {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10000; i++) {
            executorService.execute(new Tasks());
        }
    }
}
class Task implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

运行结果:
image.png 查看源码: image.png 核心线程和最大线程数量都是1,采用的队列是LinkedBlockingQueue无限队列

5.newScheduledThreadPool(定时线程池)

public class ScheduleThreadPoolTest {
    public static void main(String[] args) {
        ScheduledExecutorService schedule = Executors.newScheduledThreadPool(10);
//        schedule.schedule(new Tasks(),2, TimeUnit.SECONDS);
        schedule.scheduleAtFixedRate(new Tasks(),1,3,TimeUnit.SECONDS);


    }
}

运行结果: image.png 代码说明:

  • scheduleAtFixedRate(new Tasks(),1,3,TimeUnit.SECONDS):1秒的时候开始执行,每个3秒执行一次
  • TimeUnit.SECONDS:单位为秒 查看源码: image.png
  • Integer.MAX_VALUE:最大整型数
  • new DelayedWorkQueue():使用的是延迟队列

6.newCachedThreadPool(可缓存线程池)

特点:具有自动回收多余线程的功能 缺点:Integer.MAX_VALUE会导致创建很多的线程,造成oom错误

public class CacheThreadPoolTest {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 1000; i++) {
            executorService.execute(new Tasks());
        }
    }
}

运行结果:
image.png
源码: image.png

  • new SynchronousQueue():采用直接交换队列
  • 60L : 60秒自动回收