线程池
线程池
是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源
目的:节省资源
通常,线程池都是通过线程池工厂创建,再调用线程池中的方法获取线程,再通过线程去执行任务方法。
使用线程池方式--Runnable接口
使用线程池中线程对象的步骤:
n 创建线程池对象
n 创建Runnable接口子类对象
n 提交Runnable接口子类对象
n 关闭线程池
package com.oracle.Demo02;
public class MyRunnable2 implements Runnable{
public void run() {
for (int i = 0; i <100; i++) {
//getName() 得到线程名称
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
package com.oracle.Demo02;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Demo01 {
public static void main(String[] args) {
//从线程池工厂中创建线程池对象
ExecutorService es=Executors.newFixedThreadPool(2);
//创建线程任务对象
MyRunnable2 mr=new MyRunnable2();
//提交线程任务,让线程随机挑选一条想吃执行线程任务
es.submit(mr);
es.submit(mr);
es.submit(mr);
//释放资源
es.shutdown();
}
}
使用线程池方式—Callable接口
l Callable接口:与Runnable接口功能相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果,call方法可抛出异常。
l ExecutorService:线程池类
n <T> Future<T> submit(Callable<T> task):获取线程池中的某一个线程对象,并执行线程中的call()方法
l Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用
l 使用线程池中线程对象的步骤:
n 创建线程池对象
n 创建Callable接口子类对象
n 提交Callable接口子类对象
n 关闭线程池
package com.oracle.Demo02;
import java.util.concurrent.Callable;
public class MyCallble implements Callable<String> {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
return "abc";
}
}
package com.oracle.Demo02;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Demo02 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//从线程池工厂中创建线程池对象
ExecutorService ex=Executors.newFixedThreadPool(2);
//创建线程任务对象
MyCallble mc=new MyCallble();
//执行线程任务并获取call方法返回值
Future<String> f=ex.submit(mc);
//从Future中获取返回值
String str=f.get();
System.out.println(str);
//释放资源
ex.shutdown();
}
}
2个线程,1个线程计算1-100的和,另一个线程计算1-200的和
package com.oracle.Demo02;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Demo04 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//2个线程,1个线程计算1-100的和,另一个线程计算1-200的和
//创建俩个线程任务
GetSum sum1=new GetSum(1,100);
GetSum sum2=new GetSum(1,200);
//从线程池中创建线程池对象
ExecutorService ex=Executors.newFixedThreadPool(2);
//执行线程任务并获取call方法返回值
Future<Integer> f1=ex.submit(sum1);
Future<Integer> f2=ex.submit(sum2);
//获取返回值
System.out.println(f1.get());
System.out.println(f2.get());
//关闭线程
ex.shutdown();
}
}
package com.oracle.Demo02;
import java.util.concurrent.Callable;
public class GetSum implements Callable<Integer>{
private int a;
private int b;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
public GetSum() {
super();
}
public GetSum(int a, int b) {
super();
this.a = a;
this.b = b;
}
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
int sum=0;
for (int i = a; i < b; i++) {
sum=sum+i;
}
return sum;
}
}
浙公网安备 33010602011771号