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框架图:

  • 相关阅读:
    YYHSOI模拟赛题解(T6围栏问题)
    取水
    Spring.Net实现跨数据库服务层事务管理
    使用node.js + jsonserver + mock.js 搭建本地开发mock数据服务
    [转]SQL SERVER整理索引碎片测试
    asp.net mvc 安全测试漏洞 " HTTP 动词篡改的认证旁路" 问题解决
    JavaScript中子类调用父类方法的实现
    asp.net mvc 安全测试漏洞 "跨站点请求伪造" 问题解决
    C#学习记录3下——类的封装,继承,多态
    C#学习记录8——XAML
  • 原文地址:https://www.cnblogs.com/gushiye/p/13875807.html
Copyright © 2011-2022 走看看