Java学习之线程池

来源:互联网 发布:超级搜索软件 编辑:程序博客网 时间:2024/05/21 09:06

1、使用线程池的目的:

程序启动一个新线程成本是比较高的,因为它要设计到要与操作系统进行交互,而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程是,更应该考虑使用线程池

2、特点:

线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用

3、创建

在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池

JDK5新增了一个Executors工厂类来生产线程池,

public static ExecutorService newFixedThreadPool(int nTheads)

使用步骤:

(1)创建线程池对象

ExecutorService pool = Executors.newFixedThreadPool(2);

(2)创建Runnable实例

MyRunnable my = new MyRunnable();

(3)提交Runnable实例

pool.submit(my);

(4)关闭线程池

pool.shutdown();

案例1:实现Runnable接口实现线程池的使用

代码:

package com.edu_07;public class MyRunnable implements Runnable{@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(i);}}}
主程序:

package com.edu_07;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExecutorsDemo {public static void main(String[] args) {//创建线程池对象 ExecutorService pool = Executors.newFixedThreadPool(2);ExecutorService es = Executors.newFixedThreadPool(2);//创建MyRunnable实例MyRunnable mr = new MyRunnable();MyRunnable mr2 = new MyRunnable();//提交实例es.submit(mr);es.submit(mr2);//关闭线程池es.shutdown();}}


案例2:实现Callable接口实现线程池的使用

package com.edu_08;import java.util.concurrent.Callable;public class MyCallable implements Callable<Object>{@Overridepublic Object call() throws Exception {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+":"+i);}return null;}}
主程序:

package com.edu_08;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Test {public static void main(String[] args) {//创建线程池对象 ExecutorService pool = Executors.newFixedThreadPool(2);ExecutorService es = Executors.newFixedThreadPool(2);//创建MyRunnable实例MyCallable mr = new MyCallable();MyCallable mr2 = new MyCallable();//提交实例es.submit(mr);es.submit(mr2);//关闭线程池es.shutdown();}}


案例3:实现Callable接口实现线程池的使用,实现多线程求和,1-10之和,1-100之和

package com.edu_09;import java.util.concurrent.Callable;public class MyCallable implements Callable<Integer>{private int start;private int end;public MyCallable(int start,int end){this.start = start;this.end = end;}@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = start; i < end+1; i++) {sum +=i;}return sum;}}
主程序:

package com.edu_09;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class Test {public static void main(String[] args) throws Exception {//创建线程池对象 ExecutorService pool = Executors.newFixedThreadPool(2);ExecutorService es = Executors.newFixedThreadPool(2);//创建MyRunnable实例MyCallable mr = new MyCallable(1,10);MyCallable mr2 = new MyCallable(1,100);//提交实例Future<Integer> sm1 = es.submit(mr);Future<Integer> sm2 = es.submit(mr2);//获取返回值System.out.println(sm1.get());System.out.println(sm2.get());//关闭线程池es.shutdown();}}