Java 并发 —— Thread、Executor、线程池

来源:互联网 发布:第三方微信软件 编辑:程序博客网 时间:2024/06/05 11:48
  • Java 线程池:
    • ThreadPoolExecutor,创建此线程池的方法:
      • new
      • Executors.newCachedThreadPool():尽量避免使用,其无法控制线程数量,
    • ScheduledThreadPoolExecutor:定时执行;

1. Thread

  • Thread.yield():静态方法,其实对线程调度器(Java 线程机制的一部分,可将 CPU 从一个线程转移到另一个线程),意在告诉编译器“我已经执行完生命周期中最重要的部分了,此刻正是切换给其他嗷嗷待哺的任务执行一段时间的大好机会”。
  • 将 Runnable 对象提交给 Thread 构造器,使用 Thread 对象来驱动 Runnable 对象的执行;

    public class Liftoff implements Runnable{}// 不使用 Thread 的驱动方式public class MainThread {    public static void main(String[] args) {        Liftoff launch = new Liftoff();        launch.run();    }}// 使用 Thread 的驱动方式public class BasicThread {    public static void main(String[] args) {        Threaad t = new Thread(new Liftoff());        t.start();    }}

2. Executor

java.util.concurrent 包中的 Executor(执行器,Java SE5 以后)用于管理 Thread 对象,以简化并发编程。

Executor 在客户端和任务执行之间提供了一个间接层。

public class CachedThreadPool {    public static void main(Srting[] args) {        ExecutorService exec = Executors.newCachedThreadPool();        for (int i = 0; i < 5; ++i) {            exec.execute(new Liftoff());        }        exec.shutdown();    }}

3. 线程池:不使用线程池与使用线程池

  • 使用线程池

    ThreadPoolExecutor tp = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS,     new LinkedBlockingQueue<Runnable>(COUNT));for (int i = 0; i < COUNT; ++i){    tp.executor(new Runnable(){        @Override        public void run() {            ....        }    });}
  • 不使用线程池

    for (int i = 0; i < COUNT; ++i){    Thread thread = new Thread(){        @Override        public void run(){            ...        }    }    thread.start();}

使用线程池与不使用线程池的显著差异就在于,使用线程池的方式是复用线程的,而不使用线程池则需要每次都创建新的线程,在一个循环中不断地创建对象,显然是一件效率底下的事情。

4. 使用 ThreadPoolExecutor 创建线程池而非 Executors.newCachedThreadPool()

Java 中创建线程池,除了 ThreadPoolExecutor,还有定时的线程池 ScheduledPoolExecutor。需要注意的是对于 Executors.newCachedThreadPool() 方法返回的线程池的使用,该方法返回的线程池是没有线程上限的,使用时需要格外的小心,因为没有方法控制总体的线程数量,而每个线程都是消耗内存的,这可能会导致过多的内存占用。建议不要使用这个方法返回的线程池,而是使用固定线程上限的线程池。

阅读全文
0 0
原创粉丝点击