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