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

  • 相关阅读:
    js获取url参数值的方法总结
    Tomcat的配置与在IDEA上使用Tomcat
    windows配置并启动apache的方法
    图解 | 你管这破玩意叫计算机?
    【.NET 与树莓派】PWM 调节LED小灯的亮度
    【.NET 与树莓派】i2c(IIC)通信
    【.NET 与树莓派】矩阵按键
    【.NET 与树莓派】使用 GPIO 库
    【.NET 与树莓派】上手前的一些准备工作
    《红楼梦》最经典的12首诗词,读懂了才是人生
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9421207.html
Copyright © 2011-2022 走看看