zoukankan      html  css  js  c++  java
  • java扩展多线程创建方法和线程池返回值

    java扩展多线程创建方法和线程池返回值

    一、线程创建方式

    在java中可以宽泛的定义两种线程创建方式,一种是继承Thread,一种是实现Runnable,但是这两种都没有返回值,所以又设计了callable和Future两种接口,其中Callable来执行任务,Future来获取结果。

    1.1、继承方式

    写一个Thread类,重写run方法,用satart开启。在java中类只能单继承,所以如果使用Thread来完成多线程,会具备一定的局限性

    1.2、实现方式

    实现Runnable,重写run方法,然后创建对象,将实现接口的对象作为参数,传入Thread对象中

    1.3、匿名内部类

    匿名内部类是对上面两种方法的简写

    1.4、callable和future

    这里应该明白这两个都是线程池里应用,单独使用callable和future是有意义的,首先callable是有返回值的,这里应该用futuretask封装一下callable的返回结果,将其扔到线程里面。因为futuretask里面有get方法可以获取到返回到结果值。

    这种方法较为繁琐,使用线程池的话就比较简单了。

    1.5、线程池

    线程池应当会是做多线程业务的主要手段。

    简单来说是一个承载多个线程的容器,人们不用在手动去创造容器,需要容器直接用线程池里面的线程就行,用完还回来,这个线程还可以被下个需求使用,这样线程就避免了重复的开启关闭,用线程就去池子里拿,用完还回去就行。这样节省了大量的CPU资源。

    要明白,使用线程池,任务不再是直接提交给某个线程,而是提交给整个线程池,线程池拿到任务后,在内部寻找空闲的线程。一个线程只能执行一个任务,但可以同时向一个线程池提交多个任务。

    线程池的好处:

      1、降低资源消耗

      2、提高响应速度

      3、提高线程的可管理性

    1.5.2、线程池的框架

    在了解线程池之前先了解线程池的框架以及底层原理还有顶层接口。

     

     如果,想要创建线程池,需要使用executor的实现类,但是实现类的创建很麻烦,需要填很多的参数,比如使用ThreadPoolExecutor创建,如图

    ThreadPoolExecutor tpe = new ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue);
    

     这些参数的配置,繁琐,长时间不用就忘记了。所以java在JDK5以后除了executors工具类,方便快捷的创建线程池。

    executors框架图:

  • 相关阅读:
    c#与科学计算之一:发掘 C# 特性赋予科学计算项目以威力(转贴)
    我使用使用vs2005的理由
    MapXtrem2004经典代码:asp.net鹰眼
    LaheyFujitsu Fortran v7.1初感受
    .NET平台上的编译器不完全列表(转别)
    iNET:Microsoft.NET的Java实现
    MapXtreme2004 & vs2005的官方回答
    告别一段时间
    MapXtreme2004 连接oracle spatial的问题(已解决)
    手工卸载.Net写的win服务
  • 原文地址:https://www.cnblogs.com/gushiye/p/13875807.html
Copyright © 2011-2022 走看看