线程池
只创建一个线程执行一个任务的缺点:
我们创建一个线程执行任务后线程死亡.
如果线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。
定义
线程池就是存放线程的容器.
线程池的优点
线程池里面的线程不会销毁,可以重复使用.减少了线程的创建和销毁,提高线程的利用率,节省了资源
Runnable实现线程池
定义继承Runnable的类,并重写run方法
public class MyRunnable implements Runnable{
private String name;
@Override
public void run() {
while (true){
name = Thread.currentThread().getName();
System.out.println(name+"正在执行任务");
}
}
}
public static void main(String[] args) {
ExecutorService ex = Executors.newFixedThreadPool(3);//创建容量为3的线程池
MyRunnable mr = new MyRunnable();//实例化Runnable对象
ex.submit(mr);//将对象提交到线程池中运行
ex.submit(mr);
ex.submit(mr);
}
Callable实现线程池
步骤
1.创建线程池
2.定义类实现Callable
3.重写call方法
4.创建实现类对象
5.提交任务
6.通过Future对象的get方法得到返回值
代码实例
public class MyCallable implements Callable {
private int sum;
@Override
public Object call() throws Exception {
for (int i = 1; i <= 100; i++) {
sum += i;
}
return sum;
}
}
public class Demo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCallable mc = new MyCallable();
ExecutorService pool = Executors.newFixedThreadPool(2);
Future<Integer> future = pool.submit(mc);
Integer e = future.get();
System.out.println(e);
}
}