向线程池提交任务

1.1 execute()

    用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功。输入的是一个Runnable实例。

public void execute(Runnable command) { e.execute(command); }

如果没有特殊要求,使用缓存线程池是最合适的;

如果只能运行一个线程,就使用单线程池;

如果运行调度任务,则按需使用调度线程池或单线程池;

如果没有其他特殊要求,可以直接使用ThreadPoolExecutor类的构造函数来创建线程池,并自己给定7个参数。

public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(3);
List<Future<String>> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
//任务放到阻塞队列
executorService.execute(new Runnable() {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
});
}

  

1.2 submit()

    用于提交需要返回值的任务,线程池会返回一个Future类型对象,通过此对象可以判断任务是否执行成功,并可通过get()获取返回值,get()会阻塞当前线程知道任务完成,而使用get(long,unit)方法则会阻塞一段时间后立即返回,可能任务没有执行完。

public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(3);
List<Future<String>> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
//任务放到阻塞队列
Future<String> f = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
TimeUnit.SECONDS.sleep(2);
return Thread.currentThread().getName();
}
});
list.add(f);
}
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).get()+"--------------"+i+"-------------------------");
}
}

关闭线程池

通过调用线程池的shutdown或shutdownNow方法来关闭线程池。

他们两个原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来终端线程,所以无法响应终端的任务可能永远无法终止。

shutdownNow:首先将线程池的状态设置成stop,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行的任务的列表。

shutdown:只是将线程池的状态设置成shutdown状态,然后中段所有没有正在执行任务的线程。

只要调用者两个关闭方法中的任意一个,isShutdown方法就会返回true,当所有的任务关闭后,才表示线程池瓜女子成功,这是调用isTerminaed方法会返回true。

通常shutdown方法来关闭线程池,若任务不一定执行完,则可以调用shutdownNow方法。

使用有界队列,可以增加系统的稳定性和预警能力。

线程池的状态

1. 当线程池创建后,初始为running状态

2. 调用shutdown方法后,处于shutdown状态,此事不再接受新的任务,等待已有的任务执行完毕

3. 执行shutdownNow方法后,进入stop状态,不在接受新的任务,并且尝试终止正在执行的任务

4. 当处于shutdown或stop状态,并且所有的工作线程已经销毁,任务缓存队列已经清空,线程池被设为terminated状态。

     * Possible state transitions:
* NEW -> COMPLETING -> NORMAL
* NEW -> COMPLETING -> EXCEPTIONAL
* NEW -> CANCELLED
* NEW -> INTERRUPTING -> INTERRUPTED private static final int NEW = 0;
private static final int COMPLETING = 1;
private static final int NORMAL = 2;
private static final int EXCEPTIONAL = 3;
private static final int CANCELLED = 4;
private static final int INTERRUPTING = 5;
private static final int INTERRUPTED = 6;

  

Java并发:搞定线程池(中)的更多相关文章

  1. Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  2. Java并发编程:线程池的使用(转)

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  3. (转)Java并发编程:线程池的使用

    背景:线程池在面试时候经常遇到,反复出现的问题就是理解不深入,不能做到游刃有余.所以这篇博客是要深入总结线程池的使用. ThreadPoolExecutor的继承关系 线程池的原理 1.线程池状态(4 ...

  4. Java并发编程:线程池的使用(转载)

    转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  5. Java并发编程:线程池的使用(转载)

    文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  6. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  7. 【转】Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  8. 13、Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  9. Java并发:搞定线程池(上)

    原文地址:https://www.nowcoder.com/discuss/152050?type=0&order=0&pos=6&page=0 本文是在原文的基础+理解,想要 ...

随机推荐

  1. jQuery基础--jQuery特殊属性操作

    1.index() 会返回当前元素在所有兄弟元素里面的索引. <!DOCTYPE html> <html lang="zh-CN"> <head> ...

  2. jQuery基础--音乐视频操作

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. SpringBoot实现上传下载(二)

    这篇写下载. **1.实现思路** 上一篇的数据库设计中,我们有一个字段始终没有用到fileName,这是用来给Layer对象存储文件名的,以此来完成文件与对象的对应, ![image.png](ht ...

  4. JVM(9)之 年轻代收集器

    开发十年,就只剩下这套架构体系了! >>>   继续上一篇博文所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程.如果STW所用的时间长而且次数多的话,那么我们整个系统 ...

  5. [SDOI2017]数字表格 (莫比乌斯反演)

    链接:https://ac.nowcoder.com/acm/problem/20391来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  6. springboot全局字符编码设置

    1.在application.properties中设置 #编码格式 spring.http.encoding.force=true spring.http.encoding.charset=UTF- ...

  7. jmeter 参数化3_User Defined Variables(用户自定义变量)

    User Defined Variables:  一般用于Test Plan中不需要随请求迭代的参数设置,如:Host.Port Number 操作路径:Thread Group-->Add-- ...

  8. 2.xml约束技术----------dtd约束

    1.xml的约束 (1)为什么需要定义约束了 比如现在定义一个person的xml文件,只想要这个文件里面保存人的信息,比如name age等,但是如果在xml文件中写了一个元素<猫>,发 ...

  9. docker-compose运行ES, Kibana和Cerebro

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11764003.html docker-compose.yaml version: '2.2' serv ...

  10. vscode workspace 地址重置

    换了新电脑,做了vscode的迁移,workspace的物理地址换了,一直找不到修 正的地方 可以直接用文本编辑器打开 SourceDevelop.code-workspace类似这个workspac ...