【技术交流】让我们来谈一谈多线程和并发任务
相信你已经了解过多线程的概念,不妨咱们来回顾下,做个暖场如何
相关概念
线程、进程
依赖包含关系、相似(状态)、区别(内存共享、资源共享、成本)
进程是操作系统分配资源的基础单位,而线程是CPU执行的基础单位。
线程与线程间是并列且独立的。
线程空间、ThreadLocal、线程上下文
线程运行时所占用的内存、锁、cpu等资源的一个虚拟视图
线程的一个局部变量,可以理解为与当前线程绑定的一个map
线程空间的一个实时状态
线程状态
创建、运行、阻塞、销毁
线程与锁
加锁是为了同步调度
锁的类型:共享锁、互斥锁;只读锁、可写锁
死锁
争夺资源
调度失当
线程并发模型
阻塞队列
当队列不满足操作条件时,操作线程将进入阻塞状态
get()时,如果队列为空,则阻塞线程,直到成功执行了add()
add()时,如果队列已满,则阻塞线程,直到成功执行了get()
最常用的一种并发调度器eg :生产者-消费者
闭锁
闭锁线程转换到“开门”状态之前,任何尝试“进门”的线程都会被阻塞
eg:登机
关卡
所有线程都执行到“关卡”点之前,任何尝试“过关”的线程都会被阻塞
eg:大巴车
线程实现
java多线程实现,有两种方法。继承Thread,实现接口Runable。大多数时候我们采用后者。原因很简单:单继承,多实现,况且java的设计原则有一条是“面向接口编程”。
测试类
public class TestMain {@Testpublic void testThread(){//Thread th1 = new TestNoSynThread();Thread th2 = new TestNoSynThread();th1.start();th2.start();}@Testpublic void testRunable(){//TestNoSynRunable r = new TestNoSynRunable();Thread th1 = new Thread(r,"thread-a");Thread th2 = new Thread(r,"thread-b");th1.start();th2.start();}
}
注:start方法只是启动线程,使线程处于可运行状态,并没有运行。一旦得到cpu,就开始执行重写的run方法。run执行完毕,线程结束。
下面再来介绍并发实现的另一种方式,实际上是Runable方式上的封装。在JDK1.5出现之后,Sun发布的多线程并发处理的工具包
java.util.concurrent
Executor
并发任务执行器的顶级抽象,只针对RunnableExecutorService
对Executor进行扩展,支持Callable和FutureCallable
对Runnable进行扩展,提供了返回值。Future
阻塞线程,直到Callable返回了值FutureTask
实现了Callable和Future
可以简单理解为同时是生产者和消费者的类其它
闭锁、关卡等实现
并发任务使用
声明一个ExecutorService
向ExecutorService 提交一个或多个Callable,并获取Future
从Future中获取Callable的返回结果
项目应用
实际上是一个“大巴车”模型
测试类
public class TestExecutorService {private int SIZE = 10;/*** 计算1+2+...+100.** @author wuyichen-ghq* @since 2013-12-31*/@Testpublic void main() {ExecutorService exeService = Executors.newCachedThreadPool();// 任务列表,分成1+10、11+20、。。。、91+100List<FutureTask<Integer>> taskList = new ArrayList<FutureTask<Integer>>(SIZE);for (int i = 0; i < SIZE; i++) {TestFutureTask task = new TestFutureTask(i * 10 + 1, (i + 1) * 10);taskList.add(new FutureTask<Integer>(task));}// 逐个提交任务(这里可以将任务创建和提交放在一个for里)for (FutureTask<Integer> task : taskList) {exeService.submit(task);}// 逐个获取任务结果FutureTask<Integer> task = null;// 任务序列号int taskIndex = 0;try {while (taskIndex < taskList.size()) {task = taskList.get(taskIndex);assert task != null;int result = task.get();System.out.println(result);taskIndex++;}} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}
task类
public class TestFutureTask implements Callable<Integer>{private int begin;private int end;/*** TODO:(构造方法描述)** @author wuyichen-ghq* @since 2013-12-31* @param i*/public TestFutureTask(int begin,int end) {this.begin = begin;this.end = end;}/*** TODO:(方法描述)** @author wuyichen-ghq* @since 2013-12-31* @throws 无* @see java.util.concurrent.Callable#call()**/@Overridepublic Integer call() throws Exception {int result = 0;for(int i=begin;i<=end;i++){result = i + result;}return result;}
}
要注意的地方:
异常处理
ExecutorService有两个方法:submit、execute
that's all!如果文章中什么错误,请与我联系,也欢迎您跟我邮件交流哦!
邮箱:wyc_job@163.com
转载于:https://blog.51cto.com/atip3/1347150
【技术交流】让我们来谈一谈多线程和并发任务相关推荐
- linux的多任务 多进程,浅谈linux模拟多线程崩溃和多进程崩溃
结论是: 多线程下如果其中一个线程崩溃了会导致其他线程(整个进程)都崩溃: 多进程下如果其中一个进程崩溃了对其余进程没有影响: 多线程 #include #include #include #incl ...
- 【kafka】浅谈Kafka的多线程消费的设计
1.概述 转载:浅谈Kafka的多线程消费的设计 看原文去... 一.前言 跟RabbitMQ相比,Kafka的分区机制(Partition)使其支持对同一个"队列"分片并行读取, ...
- 浅谈Java内存模型、并发、多线程
浅谈Java内存模型.并发.多线程 Java内存模型(Java Memory Model)是围绕着在并发编程中如何处理原子性,可见性,有序性三个特性而建立的模型. 下面我简单描述一下这三个特性: 原子 ...
- linux多线程求和_谈一谈C++中的多线程(上)
本篇文章围绕以下几个问题展开: 何为进程?何为线程?两者有何区别? 何为并发?C++中如何解决并发问题?C++中多线程的语言实现? 同步互斥原理以及多进程和多线程中实现同步互斥的两种方法 Qt中的多线 ...
- 写在工作的第十年: 谈一谈专注和基础的重要性
写在工作的第十年: 谈一谈专注和基础的重要性 老帮菜的自我吐槽 不知不觉, 作为一个打工人, 作为一个写程序的打工人, 职业生涯的第十个年头悄然而至. 从一个充满雄心壮志的有志青年, 到如今有家有室的 ...
- 谈一谈网络编程学习经验(陈硕)
作者:陈硕 原文地址:http://blog.csdn.net/solstice/article/details/6527585 本文谈一谈我在学习网络编程方面的一些个人经验."网络编程& ...
- 谈一谈网络编程学习经验
转自 陈硕 giantchen@gmail.com blog.csdn.net/Solstice 2011-06-06 PDF 版下载:https://github.com/downloads/ch ...
- 谈一谈网络编程学习经验(06-08更新)
谈一谈网络编程学习经验 陈硕 giantchen@gmail.com blog.csdn.net/Solstice 2011-06-08 PDF 版下载:https://github.com/down ...
- 谈一谈网络编程的经验
谈一谈网络编程学习经验 陈硕 giantchen@gmail.com blog.csdn.net/Solstice 2011-06-06 本文谈一谈我在学习网络编程方面的一些个人经验."网络 ...
- 谈一谈网络编程学习经验——陈硕
陈硕 giantchen@gmail.com blog.csdn.net/Solstice 2011-06-06 PDF 版下载:https://github.com/downloads/chensh ...
最新文章
- 怎么看电脑屏幕尺寸_经常面对电脑怎么护眼?电脑族怎么保养身体?
- 以太坊知识教程------交易
- java虚拟机 第二章Java内存区域与内存溢出异常
- 跟我学Shiro目录贴
- Python 第三方模块之 numpy.random
- arduino使用oled代码_【惊不?】Arduino改造古董卡西欧计算器为作弊神器
- (转) 微软项目管理培训笔记(一)
- Hadoop生态圈-Hbase的API常见操作
- 一维装箱问题 java_c语言来实现贪心算法之装箱问题
- 从DOM到虚拟DOM——前端DOM发展史、性能与产能双赢背后的思考
- lucene bug的报告经历
- jQuery 事件源码定位
- zblog php获取文章的第一张图片,zblog 获取文章图片作缩略图的几种方式
- “个人云”复兴:智能化成为新趋势
- DB2 sqlCode错误信息
- 船务公司简称与缩写一览表
- php hprose扩展1.5.5,Laravel框架RPC解决方案--Hprose
- 错误的英语提示翻译 以及经常犯的无错误
- 解决IE浏览器打印iframe页面时字体等样式缩小的问题
- 计算机毕业设计Java房产中介管理系统(源码+系统+mysql数据库+lW文档)