zoukankan      html  css  js  c++  java
  • 线程池 -实现线程复用

    线程池:


    • 实现线程的复用,无须反复创建线程而消耗过多的资源,提高响应速度

    • 可用集合来实现 容器->集合(ArrayList,HashSet,LinkedList< Thread >,HashMap)

    原理:


    • 当程序第一次启动时,创建多个线程,使用时采用Thread T=list.remove(),即可调用线程
    • 同理也可用Thread T=linded.removeFirst();
    • 使用完后记得还回线程池,采用list.add()或linked.addLast(t);
    • 在JDK1.5后,不用自己创建线程池了,已经内置了

    线程池创建


    • java.util.concurrent 类 Executors(执行者) -线程池工厂类

    • 利用Executors静态方法创建

      static ExecutorService newFixedThreadPool(int nThreads)
      创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,在需要时使用提供的 ThreadFactory 创建新线程。

      返回的是ExecutorService接口的实现类对象,可用其接收(面向接口编程

    ExecutorService接口生成的对象:


    • 取线程,调用start方法,执行线程任务用以下方法,内含归还线程

      submit(Runnable task)提交一个Runnable任务进行执行

    • 关闭/销毁线程

      void shutdown()

    使用步骤:


    1. 使用线程池的工厂类Executors里提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池,面向接口编程

      ExecutorService exec = Executors.newFixedThreadPool(3);

      多态: 接口 =

    2. 创建一个类,实现Runnable接口,重写run方法,设置线程任务
    package cn.learn.thread.ThreadPool;
    
    public class RunnableImpl implements Runnable {
        @Override
        public void run() {
            //获取线程名称
            System.out.println(Thread.currentThread().getName()+"创建了新的线程");
        }
    }
    
    
    1. 调用ExecutorService对象中的方法submit,传递线程任务(实现类),开启线程,执行方法

      exec.submit(new RunnableImpl());

    2. 调用ExecutorService对象中的方法shutdown销毁线程池(不建议执行)

      exec.submit(new RunnableImpl());


    package cn.learn.thread.ThreadPool;
    
    import java.util.concurrent.Executor;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class ThreadPool {
        public static void main(String[] args) {
            //创建线程池,有三个线程
            ExecutorService exec = Executors.newFixedThreadPool(3);
            //调用ExecutorService对象中的方法submit,传递线程任务(实现类),开启线程,执行方法
            exec.submit(new RunnableImpl());
            //线程池一直开启,使用完了会归还给线程池
            exec.submit(new RunnableImpl());
            exec.submit(new RunnableImpl());
    
            //关闭线程池(不建议执行)
            exec.shutdown();
    
            //无法再执行,线程池没了,无法获取线程了
            //exec.submit(new RunnableImpl());
        }
    }
    
  • 相关阅读:
    每日总结
    每日总结
    每日总结
    每日总结
    每周总结
    每日总结
    10.20
    10.19
    10.18
    10.17
  • 原文地址:https://www.cnblogs.com/huxiaobai/p/11528931.html
Copyright © 2011-2022 走看看