zoukankan      html  css  js  c++  java
  • Java 并发 —— Thread、Executor、线程池

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

  • 相关阅读:
    最棒的HyperV监控工具 HyperV Gadget
    VSTS 强制TFS更新用户组权限
    Touch Diamond 印象
    Travelers
    Touch 全能名片王
    惠普前总裁孙振耀指点职业规划
    Shinning 我所听过最棒的演讲
    DB2 9 运用开辟(733 考试)认证指南,第 2 局部: DB2 数据独霸(9)
    DB2 9 使用斥地(733 测验)认证指南,第 1 局部: 数据库对象与编程措施(2)
    DB2 9 行使启示(733 检验)认证指南,第 2 部分: DB2 数据行使(2)
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9421207.html
Copyright © 2011-2022 走看看