- 浏览: 5389 次
- 性别:
- 来自: 北京
文章分类
最新评论
线程状态转化图
这个图我觉得应该是市面比较通俗易懂的多线程状态转换图,wait()和sleep()的区别显而易见,wait会释放锁然后等待notify()、notifyAll()才会激活然后等待获得该对象锁之后进入可运行状态,而sleep()则是在指定的时间内一直阻塞着线程,到时间后才会进入可运行状态。大家可以自己写个小程序按照图上面的过程实践尝试一把Thread 有个getState()可以查看当前线程的状态!
线程进入BLOCKED状态(很显然A执行后B一直在阻塞中,等待A执行完成后,B才执行完成)
线程池:
Java通过Executors工厂类来产生连接池,该工厂类中包含如下的几个静态工程方法来创建连接池:
1、public static ExecutorService newFixedThreadPool(int nThreads):创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
2、public static ExecutorService newSingleThreadExecutor():创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
3、public static ExecutorService newCachedThreadPool():创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
4、public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize):创建具有指定线程数的线程池,它可以再指定延迟后执行线程任务,corePoolSize指池中所保存的线程数,即使线程是空闲的也被保存在线程池内。
二、ExecutorService类
可以看到上面的5个方法中,前面3个方法的返回值都是一个ExecutorService对象。该ExecutorService对象就代表着一个尽快执行线程的线程池(只要线程池中有空闲线程立即执行线程任务),程序只要将一个Runnable对象或Callable对象提交给该线程池即可,该线程就会尽快的执行该任务。
ExecutorService有几个重要的方法:
1、isShutdown() 如果此执行程序已关闭,则返回 true。
2、isTerminated() 如果关闭后所有任务都已完成,则返回 true。
3、shutdown() 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。
4、 List<Runnable> shutdownNow()
试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。
5、<T> Future<T> submit(Callable<T> task)
提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。
6、Future<?> submit(Runnable task)
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。
7、<T> Future<T> submit(Runnable task, T result)
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。
更详细的参考JDK API文档。
submit方法是对 Executor接口execute方法的更好的封装,建议使用submit方法。
1.newFixedThreadPool的使用
因为我创建的是一个大小为2的固定长度线程池,根据输出可以看出只有一开始是一起创建了两个线程因为此时线程已经满了这时已经不在创建线程了而是开始执行了后面是执行完一个线程就在创建一个线程,直到把要创建的5都创建并执行完毕。
2.newSingleThreadExecutor的使用
根据输出可有看到从始至终只有一个线程在执行
3.newCachedThreadPool的使用
可变线程池会动态的根据生成的线程数直接复用或创建线程
4.newScheduledThreadPool 延时线程池
这个图我觉得应该是市面比较通俗易懂的多线程状态转换图,wait()和sleep()的区别显而易见,wait会释放锁然后等待notify()、notifyAll()才会激活然后等待获得该对象锁之后进入可运行状态,而sleep()则是在指定的时间内一直阻塞着线程,到时间后才会进入可运行状态。大家可以自己写个小程序按照图上面的过程实践尝试一把Thread 有个getState()可以查看当前线程的状态!
线程进入BLOCKED状态(很显然A执行后B一直在阻塞中,等待A执行完成后,B才执行完成)
线程池:
Java通过Executors工厂类来产生连接池,该工厂类中包含如下的几个静态工程方法来创建连接池:
1、public static ExecutorService newFixedThreadPool(int nThreads):创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
2、public static ExecutorService newSingleThreadExecutor():创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
3、public static ExecutorService newCachedThreadPool():创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
4、public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize):创建具有指定线程数的线程池,它可以再指定延迟后执行线程任务,corePoolSize指池中所保存的线程数,即使线程是空闲的也被保存在线程池内。
二、ExecutorService类
可以看到上面的5个方法中,前面3个方法的返回值都是一个ExecutorService对象。该ExecutorService对象就代表着一个尽快执行线程的线程池(只要线程池中有空闲线程立即执行线程任务),程序只要将一个Runnable对象或Callable对象提交给该线程池即可,该线程就会尽快的执行该任务。
ExecutorService有几个重要的方法:
1、isShutdown() 如果此执行程序已关闭,则返回 true。
2、isTerminated() 如果关闭后所有任务都已完成,则返回 true。
3、shutdown() 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。
4、 List<Runnable> shutdownNow()
试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。
5、<T> Future<T> submit(Callable<T> task)
提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。
6、Future<?> submit(Runnable task)
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。
7、<T> Future<T> submit(Runnable task, T result)
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。
更详细的参考JDK API文档。
submit方法是对 Executor接口execute方法的更好的封装,建议使用submit方法。
1.newFixedThreadPool的使用
因为我创建的是一个大小为2的固定长度线程池,根据输出可以看出只有一开始是一起创建了两个线程因为此时线程已经满了这时已经不在创建线程了而是开始执行了后面是执行完一个线程就在创建一个线程,直到把要创建的5都创建并执行完毕。
2.newSingleThreadExecutor的使用
根据输出可有看到从始至终只有一个线程在执行
3.newCachedThreadPool的使用
可变线程池会动态的根据生成的线程数直接复用或创建线程
4.newScheduledThreadPool 延时线程池
发表评论
-
Netty学习
2018-01-16 13:22 011111 -
java性能优化
2017-08-07 22:08 01111111 -
设计模式(四)
2017-07-30 18:30 38313.访问者模式 访问者模式也称为Visitor模式,使用这种 ... -
java多线程模式(二)
2017-07-18 22:05 01.Thread Specific Storage (线 ... -
java多线程模式(一)
2017-07-18 22:00 3511.Immutable Object (不可变对象) 模式 ... -
java多线程(十)
2017-07-13 23:14 0多线程分析监控调优工具 -
java多线程(八)
2017-07-13 22:54 41714、对象锁 1. 对象锁 所有对象都自动含有单 ... -
java多线程(七)
2017-07-12 23:54 425目前在Java中存在两种锁 ... -
java多线程(六)
2017-07-11 23:32 3759、悲观锁 悲 ... -
java多线程(五)
2017-07-09 20:25 4865、读写锁 相比Java中的 ... -
java源码学习(一)
2017-08-07 22:07 346AtomicBoolean源码分析 Java不能直接访问操作 ... -
java多线程(四)
2017-07-09 16:13 417锁 java 多线程的锁我是 ... -
java多线程(二)
2017-07-03 23:18 468上节说到final、volatile、synchronized ... -
java多线程(一)
2017-07-03 23:17 385很多人都对其中的一些 ...
相关推荐
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
Java多线程读大文件 java多线程写文件:多线程往队列中写入数据
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
一个java 多线程操作数据库应用程序!!!
详细的讲解了java多线程的原理,并配有代码进行实战,适合java初学者和想对多线程有进一步了解的人。
java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例
多线程启动.java多线程启动.java多线程启动.java多线程启动.java
该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!
java多线程处理数据库数据,使用并发包,无框架,可批量处数据库数据,进行增删改。。等等操作。
java多线程并发查询数据库,使用线程池控制分页,并发查询。
Java多线程实现异步调用实例。运行Main可以看到结果。main是主线程,另有A,B,C三个线程用不同的时间跑完。
资深Java专家10年经验总结,全程案例式讲解,首本全面介绍Java多线程编程技术的专著 结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 Java多线程无处不在,如...
java多线程处理大数据,可根据配置的线程数,任务去调度处理
java多线程进度条
一张图方便理解和掌握java 多线程之间通信的实质 java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,...
java多线程实现大批量数据切分成指定份数的数据,然后多线程处理入库或者导出,线程的个数和每份数据的数量都可以控制
java多线程,对多线程,线程池进行封装,方便使用
java多线程并发的在新窗口
Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...
java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号 java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号