package 线程池;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class text {
public static void main(String[] args) throws InterruptedException, ExecutionException {
/*实现线程池的接口有:
* Executor线程池顶级接口
* ExecutorService线程池接口,可通过submit(Runnable task)提交任务代码
* Executors 工厂类:通过此类可以获取一个线程池 此类实现了ExecutorService接口
* */
//使用线程池 可以 规避线程的创建和销毁 节省系统资源
ExecutorService es;
//创建一个可重用固定线程数的线程池 静态
es = Executors.newFixedThreadPool(3);
//加上主线程一共4个进程
task1 t1 = new task1();
//System.out.println("这里使用Runnable");
es.submit(t1);
es.submit(t1);
es.submit(t1);
es.submit(t1);//有个线程处于复用
//创建一个动态数量的线程池,可以根据当前任务数量多少的环境 自动增加、减少线程
//但有缺点 : 当你的系统资源很少时,不适合使用动态线程
//例如只有一共pc机,不适合使用此方法。当任务高峰期时,自动创建线程太多,则系统可能因资源不足崩溃
//es = Executors.newCachedThreadPool();//因单个pc机这里不进行测试
//submit可以 使用Runnable 也可以使用 Callable
//Runnable和Callable的区别是:Callable可以有返回值 还可以抛出异常
//Runnable缺点:当某任务需要并发处理时 需要使用返回值 Runnable无法满足需求
//例如 从1加到1万 并发处理 各线程分别算1加到1000, 1000到2000, 2000到3000... 然后求和
//System.out.println("下面使用Callable");
task2 t2 = new task2();
System.out.println("开始提交任务");
Future<Integer> f1 = es.submit(t2);//Future为callable的返回值类型 是一个接口 具有get方法获取返回值
System.out.println("提交任务完成,进入无限期等待");
Integer result = f1.get();//get方法会无限期等待,直到收到返回值
System.out.println("收到返回值,等待结束");
System.out.println("callable返回值为:"+result);
}
}
class task1 implements Runnable{
@Override
public void run() {
// TODO 自动生成的方法存根
System.out.println(Thread.currentThread().getName()+"Runnable:正在做任务1");
//Runnable不能抛出异常 所以必须用try catch 来实现 sleep方法的异常抛出
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"Runnable任务结束");
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
class task2 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
// TODO 自动生成的方法存根
System.out.println(Thread.currentThread().getName()+"Callable:正在做任务2");
Thread.sleep(4000);
System.out.println(Thread.currentThread().getName()+"Callable:任务结束");
return 100;
}
}
java学习-线程池
最新推荐文章于 2025-04-08 11:57:26 发布
1262

被折叠的 条评论
为什么被折叠?



