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

原文地址:https://www.cnblogs.com/gushiye/p/13875807.html