java基础--28.线程池简介以及实际应用

Posted 大数据小小罗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础--28.线程池简介以及实际应用相关的知识,希望对你有一定的参考价值。

线程池简介

  程序启动一个新线程的成本是比较高的,因为它涉及到要与操作系统进行交互。
  而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。
  
  线程池的好处:线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
  
在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池

线程池的创建

JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法

  • public static ExecutorService newCachedThreadPool()

  • public static ExecutorService newFixedThreadPool(int nThreads)

  • public static ExecutorService newSingleThreadExecutor()

    这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了如下方法

    • Future<?> submit(Runnable task)
    • <T> Future<T> submit(Callable<T> task)

案例演示

创建线程池对象的方法
创建Runnable实例
提交Runnable实例
关闭线程池

//创建实现Runnable接口的实例对象
public class MyRunnable implements Runnable 

    @Override
    public void run() 
        for (int x = 0; x < 100; x++) 
            System.out.println(Thread.currentThread().getName() + "--" + x);
        
    



/*
 * 如何实现线程池的代码?
 *  A:创建一个线程池对象,控制要创建几个线程对象
 *      static ExecutorService newFixedThreadPool(int nThreads) 
 *      
 *  B:这种线程池的线程可以执行:
 *      Runnable对象或者Callable对象代表的线程
 *      创建一个类实现Runnable接口
 *      
 *  C:启动线程调用如下方法:
 *       Future<?> submit(Runnable task)  
 *      <T> Future<T> submit(Callable<T> task)  
 *      
 *  D:执行完之后想结束线程,可以吗?
 *      可以  
 *      void shutdown() 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。
  */


public class ExecutorsDemo 

    public static void main(String[] args) 
        //通过工厂方法 创建一个拥有两个线程的线程池对象
        ExecutorService pool = Executors.newFixedThreadPool(2);

        //提交一个 Runnable 任务用于执行
        pool.submit(new MyRunnable());
        pool.submit(new MyRunnable());

        //启动一次顺序关闭,执行以前提交的任务,但不接受新任务。结束线程池
        pool.shutdown();
    

使用匿名内部类实现多线程

线程池的创建和使用都比较复杂,在开发中我们会尽量简化这些过程–使用匿名内部类

public class AnonymousThreadDemo 

    /**
     * 使用匿名内部类实现多线程
     */
    public static void main(String[] args) 
        //方式1:直接new Thread创建线程
        new Thread() 
            public void run() 
                for (int x = 0; x < 100; x++) 
                    System.out.println(Thread.currentThread().getName() + ":"+ x);
                
            
        .start();

        //方式2:通过Runnable接口创建线程
        new Thread(new Runnable() 
            @Override
            public void run() 
                for (int x = 0; x < 100; x++) 
                    System.out.println(Thread.currentThread().getName() + ":"+ x);
                
            
        ) 
        .start();

        //方式x:这种方式仅仅会出现在面试题中,运行的代码只是Thread类重写的run方法中的代码
        new Thread(new Runnable() 
            @Override
            public void run() 
                for (int x = 0; x < 100; x++) 
                    System.out.println("hello" + ":"+ x);
                
            
        ) 
            @Override
            public void run() 
                for (int x = 0; x < 100; x++) 
                    System.out.println("world" + ":"+ x);
                
            
        .start(); 
    

以上是关于java基础--28.线程池简介以及实际应用的主要内容,如果未能解决你的问题,请参考以下文章

JAVA线程池学习以及队列拒绝策略

一脚踩进java之基础篇44——线程池和Callable

一脚踩进java之基础篇44——线程池和Callable

多线程——java线程池简介

Java并发计算线程池最佳线程数

java优雅定制线程池