假如写网络编程的程序,socket编程就是响应客户编程的服务端。

public class ThreadPool {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(80);while (true){Socket socket = serverSocket.accept();Runnable task = new Runnable() {@Overridepublic void run() {handleRequest(socket);}};new Thread(task).start();}}private static void handleRequest(Socket socket) {}
}

这样做,每来一个就创建一个线程,会出现很多问题的。java虚拟机就挂掉了,内存溢出。

资源消耗得不到限制,并不能控制线程的数量。

//Executor 线程池创建线程池
Executor executor = Executors.newFixedThreadPool(100);

拥有100线程的线程池。

Executor executor1 = Executors.newSingleThreadExecutor();

池子里,永远只有一个线程。平常如果new一个线程,挂掉了就没有了。

single这个如果被占用了,就阻塞这里等着,如果有异常了,就拿一条新的线程。

Executor executor2 = Executors.newCachedThreadPool();

这个是缓冲线程池,不知道有多少个线程。来一个创建一个,来一个创建一个。没有上限的。

Executor是个接口,ExecutorService是个子类。

线程池的任务丢进去是不可控的,什么时间关闭,如果executor没有运行完,jvm是不可能关闭的,除非你强行关闭电源。

ExecutorService提供了关闭的方法。

List<Runnable> shutdownNow();
void shutdown();
boolean isTerminated();

线程池有三种状态:

1,运行状态。running

2,关闭状态。shutdown状态,不是立即终止,停止接受新的任务,但是等待提交的任务完成。

3,终止状态。什么任务都完成了。把线程池掐掉。

shutdownNow返回还没有执行完的任务的线程。isTerminated是所有线程都死掉了。

tomcat源码用的exector,解析http协议。

public class ThreadPool {static ExecutorService executor = Executors.newFixedThreadPool(100);//Executor 线程池public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(80);while (!executor.isShutdown()){Socket socket = serverSocket.accept();try {executor.execute(new Runnable() {@Overridepublic void run() {handleRequest(socket);}});//RejectedExecutionException 拒绝执行任务异常} catch (RejectedExecutionException e) {if (!executor.isShutdown()){System.out.println("线程池接受任务被拒绝");throw e;}}}}public void stop(){executor.shutdown();}private static void handleRequest(Socket socket) {}
}

Executors.newScheduledThreadPool();

java的定时任务的执行,可调度的定时任务的执行。

public class Shedule {private static long start;private static ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);public static void main(String[] args) {TimerTask task = new TimerTask() {@Overridepublic void run() {System.out.println(System.currentTimeMillis()-start);try{Thread.sleep(3000);}catch (InterruptedException e){e.printStackTrace();}}};TimerTask task1 = new TimerTask(){@Overridepublic void run() {System.out.println(System.currentTimeMillis()-start);}};Timer timer = new Timer();start = System.currentTimeMillis();//启动一个调度任务,delay延迟毫毛单位timer.schedule(task,1000);timer.schedule(task1,3000);}}

用Timer,线程之间是相互干扰的。Timer是个单线程。

public class Shedule {private static long start;private static ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);public static void main(String[] args) {TimerTask task = new TimerTask() {@Overridepublic void run() {System.out.println(System.currentTimeMillis()-start);try{Thread.sleep(3000);}catch (InterruptedException e){e.printStackTrace();}}};TimerTask task1 = new TimerTask(){@Overridepublic void run() {System.out.println(System.currentTimeMillis()-start);}};//        Timer timer = new Timer();start = System.currentTimeMillis();//启动一个调度任务,delay延迟毫毛单位
//        timer.schedule(task,1000);
//        timer.schedule(task1,3000);executorService.schedule(task,1000, TimeUnit.MILLISECONDS);executorService.schedule(task,3000, TimeUnit.MILLISECONDS);}}

如果第一个线程异常了,那么就阻塞在这了。

public class Shedule {private static long start;private static ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);public static void main(String[] args) {TimerTask task = new TimerTask() {@Overridepublic void run() {throw new RuntimeException();}};TimerTask task1 = new TimerTask(){@Overridepublic void run() {System.out.println(System.currentTimeMillis()-start);}};Timer timer = new Timer();start = System.currentTimeMillis();//启动一个调度任务,delay延迟毫毛单位timer.schedule(task,1000);timer.schedule(task1,3000);
//        executorService.schedule(task,1000, TimeUnit.MILLISECONDS);
//        executorService.schedule(task,3000, TimeUnit.MILLISECONDS);
    }}

executorService用的是相对时间,不是系统时间。

用那些pool,实际上底层返回的是ThreadPoolExecutor返回的。

 public ThreadPoolExecutor(int corePoolSize,//线程数量int maximumPoolSize,//最大的线程数量long keepAliveTime,//线程活跃的时间是多少TimeUnit unit,//时间单位BlockingQueue<Runnable> workQueue//里面装的是Runnable 并发容器 workQueue工作队列) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), defaultHandler);}

executor接口,关闭不是很好关闭。

Executors是工具类,可以搞线程池这些东西。这里面的方法最终弄的是ThreadPoolExecutor。都可以指定的。

转载于:https://www.cnblogs.com/fuckingPangzi/p/10155315.html

java的多线程学习,第四记相关推荐

  1. Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter

    Java IO流学习总结四:缓冲流-BufferedReader.BufferedWriter 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/det ...

  2. Java之多线程学习笔记五 —— 多线程模拟龟兔赛跑

    Java之多线程学习笔记五 -- 多线程模拟龟兔赛跑 参考教程B站狂神https://www.bilibili.com/video/BV1V4411p7EF package pers.ylw.less ...

  3. Java多线程学习十四:Lock 有哪几个常用方法?分别有什么用?

    Lock 接口是 Java 5 引入的,最常见的实现类是 ReentrantLock,可以起到"锁"的作用. Lock 和 synchronized 是两种最常见的锁,锁是一种工具 ...

  4. 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一

    Grabage Collection      GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随 ...

  5. java调用webservice_WebService学习总结(四)——调用第三方提供的webService服务

    只为成功找方法,不为失败找借口! 互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气 ...

  6. java unpark_Java多线程学习:(wait,notify)--(await,signal)--(park,unpark)

    本文主要对Java.util.concurrent中锁的相关对比学习. 他们分别是: ① Object中wait和notify; ② Lock中lock.newCondition:condition. ...

  7. 多线程学习(四)-线程范围内共享数据

    一:线程范围内共享数据: 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这时候需要 ...

  8. Java小游戏学习笔记四,动态移动进阶与子弹的发射

    人物的斜线移动 接上一章的人物移动,如果我想要这个人物往斜线的方向移动,那么上一章的方法则无法实现,所以今天要进阶的优化移动.代码如下:首先确认移动的对象,然后在对象中创建一个有参方法获得方向,将上章 ...

  9. Java多线程学习(二)synchronized关键字(1)

    转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...

最新文章

  1. R语言with函数和within函数:with函数基于表达式在dataframe上计算、within函数基于表达式在dataframe上计算并修改原始数据
  2. js滚动条下拉一定值_JS逆向 | *APD模拟登录(AES)
  3. mysql关联查询去重_MySQL外键和高级查询(连接查询、联合查询、子查询、去重查询)...
  4. TotoiseSVN的上手教程
  5. python查询mysql decimal报错_python读取MySQL数据表时,使用ast模块转换decimal格式数据的坑...
  6. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )
  7. Java API For WebSocket(七)Java EE环境
  8. paip.项目开发效率提升之思索
  9. 深入浅出 eBPF|你要了解的 7 个核心问题
  10. 大疆网上测评题库_网上测评有什么技巧或者题库推荐?
  11. VC 2015 x86的DLL绿色包(QT 5.6)
  12. PLC通讯实现-C#实现欧姆龙以太网通讯FINS UDP(三)
  13. oracle 保留池,oracle的内存结构之--查看内存信息+保留池和循环池(摘自文平书)...
  14. PCA(主成分分析)数学原理推导证明
  15. 解决Chrome浏览器变慢
  16. Unity换装系统实现
  17. 泛型---上界通配符和下界通配符
  18. ElasticSearch系列——Kibana,核心概念
  19. leetcode 寻找峰值
  20. fcitx只能打繁体字无法切换的一个解决方法linux mint

热门文章

  1. android adb移植到arm,android-ndk – 为arm处理器构建android adb
  2. linux服务器系统内核参数优化
  3. The .NET Core runtime can be found at:(Windows)
  4. Android开发笔记(三十五)页面布局视图
  5. 关于Java浮点数运算精度丢失问题
  6. spring aop获取目标对象的方法对象(包括方法上的注解)(转)
  7. 108扫货节完美收官 在线交易额破千万
  8. 使用Angular与TypeScript构建Electron应用(五)
  9. ASP.NET性能监控和优化入门
  10. CentOS 使用spawn-fcgi配置Nginx+PHP 启动脚本