关于线程的相关概念不在此阐述,请百度或谷歌之

对于学习线程来说,我认为从代码开始学习比较好,前提是有一定的技术的积累,否则请关闭不用再看了~

线程池四种实现方式。

  ①可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程

  1. package thread;
  2.  
  3. import java.util.concurrent.Executor;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6. //可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
  7. public class ThreadPoolExceutorTest1 {
  8. public static void main(String[] args) {
  9. ExecutorService cachedThreadPoll = Executors.newCachedThreadPool();
  10. for (int i = 0; i < 10; i++) {
  11. final int index = 1;
  12. try {
  13. Thread.sleep(index * 10);
  14. } catch (InterruptedException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. }
  18. cachedThreadPoll.execute(new Runnable() {
  19. public void run() {
  20. System.out.println(index);
  21. }
  22. });
  23. }
  24. }
  25. }

  ②创建定长线程池,可控线程最大并发数,超出线程会在队列中等待 

  1. package thread;
  2.  
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. //创建定长线程池,可控线程最大并发数,超出线程会在队列中等待
  6. public class ThreadPoolExecutorTest2 {
  7. public static void main(String []args) {
  8. ExecutorService fixedThreadPool=Executors.newFixedThreadPool(3);
  9. for(int i=0;i<10;i++) {
  10. final int index=1;
  11. fixedThreadPool.execute(new Runnable() {
  12. public void run() {
  13. try {
  14. System.out.println(index);
  15. Thread.sleep(2000);
  16. } catch (InterruptedException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. }
  20. }
  21. });
  22. }
  23. }
  24. }

  ③

  1. 创建定长线程池,支持定时及周期性任务执行,延迟执行示例如下(3m后执行)
  1. package thread;
  2.  
  3. import java.util.concurrent.Executors;
  4. import java.util.concurrent.ScheduledExecutorService;
  5. import java.util.concurrent.TimeUnit;
  6. //创建定长线程池,支持定时及周期性任务执行,延迟执行示例如下(3m后执行)
  7. public class ThreadPoolExecutorTest3 {
  8. public static void main(String []args)
  9. {
  10. ScheduledExecutorService scheduledThreadPool=Executors.newScheduledThreadPool(5);
  11. scheduledThreadPool.schedule(new Runnable() {
  12. public void run() {
  13. System.out.println("this is 3 demo");
  14. }
  15. },3,TimeUnit.MILLISECONDS);
  16. }
  17. }

  定期执行 延迟1秒后,3秒执行一次

  1. package thread;
  2.  
  3. import java.util.concurrent.Executors;
  4. import java.util.concurrent.ScheduledExecutorService;
  5. import java.util.concurrent.TimeUnit;
  6. //定期执行 延迟1秒后,3秒执行一次
  7. public class ThreadPoolExecutorTest35 {
  8. public static void main(String []args)
  9. {
  10. ScheduledExecutorService scheduledThreadPool=Executors.newScheduledThreadPool(5);
  11. scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
  12. public void run() {
  13. System.out.println("this is 3 demo");
  14. }
  15. },1,3,TimeUnit.MILLISECONDS);
  16. }
  17. }

  ④

  单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

  1. package thread;
  2.  
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. //单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下
  6. public class ThreadPoolExecutorTest4 {
  7. public static void main(String [] args) {
  8. ExecutorService singleThreadExecutor= Executors.newSingleThreadExecutor();
  9. for(int i=0;i<10;i++) {
  10. final int index=i;
  11. singleThreadExecutor.execute(new Runnable() {
  12. public void run() {
  13. try {
  14. System.out.println(index);
  15. Thread.sleep(2000);
  16. } catch (InterruptedException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. }
  20. }
  21. });
  22. }
  23. }
  24. }

  可以使用JDK自带的监控工具来监控我们创建的线程数量,运行一个不终止的线程,创建指定量的线程,来观察:

  1. package thread;
  2.  
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. //可以使用JDK自带的监控工具来监控我们创建的线程数量,运行一个不终止的线程,创建指定量的线程,来观察:
  6. public class ThreadPoolExecutorTest45 {
  7. public static void main(String[] args) {
  8. ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();
  9. for (int i = 0; i < 100; i++) {
  10. final int index = i;
  11. singleThreadExecutor.execute(new Runnable() {
  12. public void run() {
  13. try {
  14. while (true) {
  15. System.out.println(index);
  16. Thread.sleep(10 * 1000);
  17. }
  18. } catch (InterruptedException e) {
  19. // TODO Auto-generated catch block
  20. e.printStackTrace();
  21. }
  22. }
  23. });
  24. try {
  25. Thread.sleep(500);
  26. } catch (InterruptedException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32. }

  打开jdk自带监控工具jdk-bin-jconsole.exe,以管理员身份运行

  

在这里可进行线程的查看~,不过程序一定要先跑起来~

代码写完~不理解的可以手敲几遍会加深理解

 

 

Java-----关于线程池的使用的更多相关文章

  1. 深入理解Java之线程池

    原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  2. Java中线程池的学习

    线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程 ...

  3. java利用线程池处理集合

    java利用线程池处理集合 2018年07月23日 17:21:19 衍夏成歌 阅读数:866   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/s ...

  4. 深入理解Java之线程池(爱奇艺面试)

    爱奇艺的面试官问 (1) 线程池是如何关闭的 (2) 如何确定线程池的数量 一.线程池销毁,停止线程池 ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutdown() ...

  5. Java中线程池,你真的会用吗?

    在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ...

  6. [转]深入理解Java之线程池

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

  7. 沉淀再出发:java中线程池解析

    沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...

  8. Java并发--线程池的使用

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

  9. Java进阶——— 线程池的原理分析

    前言 在了解线程池之前,其实首先出现的疑问是:为什么要使用线程池,其次是了解什么是线程池,最后是如何使用线程池,带着疑问去学习. 为什么要使用 前面多线程文章中,需要使用线程就开启一个新线程,简单方便 ...

  10. Java调度线程池ScheduleExecutorService(续)

    链接 Java线程池详解(一) Java线程池详解(二) Java调度线程池ScheduleExecutorService 上面列出了最近写的关于java线程池ScheduleExecutorServ ...

随机推荐

  1. hbase的HQuorumPeer和QuorumPeerMain

    hbase是列式数据库,既可以单机也可以以集群的方式搭建,以集群的方式搭建一般建立在hdfs之上. 分布式的hbase如何启动? 首先启动hadoop,然后就来问题了:zookeeper和hbase的 ...

  2. Android 开发笔记___shape

    shape_oval <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android= ...

  3. AngularJS学习篇(十一)

    AngularJS 表格 ng-repeat 指令可以完美的显示表格. <!DOCTYPE html> <html> <head> <meta charset ...

  4. Nginx-动态路由升级版

    前几篇文章我们介绍了Nginx的配置.OpenResty安装配置.基于Redis的动态路由以及Nginx的监控. Nginx-OpenResty安装配置 Nginx配置详解 Nginx技术研究系列1- ...

  5. [转载] Dubbo架构设计详解

    转载自http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合 ...

  6. js的数组方法整理

    slice 从已有的数组中返回选定的元素.该方法不会修改数组,而是返回一个子数组. 语法:arr.slice(start,end) start: 必须,规定从何处开始选取.如果是负数,就是从尾部开始算 ...

  7. CocoaPods 安装及使用

    1.开启 terminal 2.移除现有 Ruby 默认源 $ gem sources --remove https://rubygems.org/ 3.使用新的源 $ gem sources -a ...

  8. js 资料

    http://javascript.ruanyifeng.com/#introduction 2.MDN 火狐中文社区  https://developer.mozilla.org/zh-CN/doc ...

  9. 【Java】单词倒序输出

    如何将一段单词倒序输出?把"Hello Java Hello China"变成"China Hello Java Hello"? 看起来好像很简单,只需要把字符 ...

  10. 如何有效的去使用一款免费的ERP

    现在市场上免费的软件不少,怎么样去使用一款免费产品是很多人比较头疼的事情. 一般使用免费ERP软件的基本都是小企业,没用过想用又舍不得花钱.如果企业有懂数据库这块儿的管理员,那都还好.如果没有,那建议 ...