• 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() 方法返回的线程池的使用,该方法返回的线程池是没有线程上限的,使用时需要格外的小心,因为没有方法控制总体的线程数量,而每个线程都是消耗内存的,这可能会导致过多的内存占用。建议不要使用这个方法返回的线程池,而是使用固定线程上限的线程池。

posted on 2017-08-17 23:22  未雨愁眸  阅读(229)  评论(0编辑  收藏  举报