多线程的简单认识(二)
来源:互联网 发布:java在线 编辑:程序博客网 时间:2024/04/30 07:41
接文章一
多线程的容器--线程池
线程池的目的:减少创建和销毁线程所带来的时间和性能的开销。
线程池的结构:线程池分为4个模块
1,线程池管理器,主要用来创建线程并管理线程池,包括创建和销毁线程池。
2,工作线程,线程池中的线程,有任务时处理,没有任务时空闲等待。
3,任务接口,每个任务要执行的接口,供工程线程调度任务的执行。
4,任务队列,当当前线程池没有空闲的线程时,把新任务放到任务队列中等待线程来处理。
线程池的创建方式:
1,Executors.newFixedThreadPool(int);创建固定个数的线程池
2,Executors.newCachedThreadPool() 创建缓存的线程池,当任务数大于线程的数时,线程池可以智能的添加新线程;当任务小于线程的数时,线程池就会收拾某个时间段没有工作的线程。线程池的大小依赖与jvm所能创建的线程大小。
3,Executors.newSingleThreadExecutor() 创建单个线程的线程池,不存在并发,只有当前线程发生异常退出,才会创建新的线程来替代当前线程继续执行任务。
4,Executors.newScheduledThreadPool(int) 创建N个可以定时或者周期性的执行任务的线程池。
多线程的简单例子 生产者消费者(api文档的例子,比较经典,直接拿来用)
class Producer implements Runnable { private final BlockingQueue queue; Producer(BlockingQueue q) { queue = q; } public void run() { try { while(true) { queue.put(produce()); } } catch (InterruptedException ex) { ... handle ...} } Object produce() { ... } } class Consumer implements Runnable { private final BlockingQueue queue; Consumer(BlockingQueue q) { queue = q; } public void run() { try { while(true) { consume(queue.take()); } } catch (InterruptedException ex) { ... handle ...} } void consume(Object x) { ... } } class Setup { void main() { BlockingQueue q = new SomeQueueImplementation(); Producer p = new Producer(q); Consumer c1 = new Consumer(q); Consumer c2 = new Consumer(q); new Thread(p).start(); new Thread(c1).start(); new Thread(c2).start(); } }
线程的种类:用户线程和守护线程(又叫 daemon 线程)
daemon线程是为了给其他线程的运行提供服务,比如GC线程。
用户线程在创建时,设置 thread.setDaemon(true) 就ok了,一定要走线程启动前设置,否则会抛异常。
当用户线程都退出时,守护线程也会自动退出,守护线程创建出来的线程也是守护线程。
先到这,如果再想到其他的,再补充。
水平有限,有问题可以留言指出,再纠正。
未完待续
0 0
- 多线程的简单认识(二)
- 多线程的简单认识
- 多线程的简单认识(一)
- android多线程之AsyncTask的初步认识(二)
- JAVA多线程变量的深入认识(二)
- iOS 对于多线程简单的认识
- 简单的多线程流水线模型(二)
- c# 多线程(一) 多线程的认识
- Java多线程(二)认识Java里面的Thread
- background的认识(二)
- 多线程的认识
- 多线程 并发的认识
- java多线程的认识
- 简单的java多线程源码分享(二)
- linux内核与驱动学习笔记(二)----对驱动简单的认识
- Java多线程--线程简单认识1
- 我所认识的EXT2(二)
- 我所认识的PHP(二)
- 二叉搜索树的前序遍历
- Iserver产品模块划分
- 使用nexus搭建maven私服、手动更新索引
- 网卡数据捕获
- JavaSE教程-04Java中循环语句for,while,do···while-练习2
- 多线程的简单认识(二)
- leetcode485. Max Consecutive Ones
- Codeforces 523C&D C.Name Quest【贪心】、D.Statistics of Recompressing Videos【模拟】
- JAVA异常初级的懵逼之路
- 最佳拟合直线
- ios开发 之 中文转拼音
- 批处理调用cacls修改文件权限
- 蓝桥杯算法提高——盾神与条状项链(链表)
- ionic开发——获取手机设备信息