相信你已经了解过多线程的概念,不妨咱们来回顾下,做个暖场如何

相关概念

  • 线程、进程

    依赖包含关系、相似(状态)、区别(内存共享、资源共享、成本)

    进程是操作系统分配资源的基础单位,而线程是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
    并发任务执行器的顶级抽象,只针对Runnable

  • ExecutorService
    对Executor进行扩展,支持Callable和Future

  • Callable
    对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

【技术交流】让我们来谈一谈多线程和并发任务相关推荐

  1. linux的多任务 多进程,浅谈linux模拟多线程崩溃和多进程崩溃

    结论是: 多线程下如果其中一个线程崩溃了会导致其他线程(整个进程)都崩溃: 多进程下如果其中一个进程崩溃了对其余进程没有影响: 多线程 #include #include #include #incl ...

  2. 【kafka】浅谈Kafka的多线程消费的设计

    1.概述 转载:浅谈Kafka的多线程消费的设计 看原文去... 一.前言 跟RabbitMQ相比,Kafka的分区机制(Partition)使其支持对同一个"队列"分片并行读取, ...

  3. 浅谈Java内存模型、并发、多线程

    浅谈Java内存模型.并发.多线程 Java内存模型(Java Memory Model)是围绕着在并发编程中如何处理原子性,可见性,有序性三个特性而建立的模型. 下面我简单描述一下这三个特性: 原子 ...

  4. linux多线程求和_谈一谈C++中的多线程(上)

    本篇文章围绕以下几个问题展开: 何为进程?何为线程?两者有何区别? 何为并发?C++中如何解决并发问题?C++中多线程的语言实现? 同步互斥原理以及多进程和多线程中实现同步互斥的两种方法 Qt中的多线 ...

  5. 写在工作的第十年: 谈一谈专注和基础的重要性

    写在工作的第十年: 谈一谈专注和基础的重要性 老帮菜的自我吐槽 不知不觉, 作为一个打工人, 作为一个写程序的打工人, 职业生涯的第十个年头悄然而至. 从一个充满雄心壮志的有志青年, 到如今有家有室的 ...

  6. 谈一谈网络编程学习经验(陈硕)

    作者:陈硕  原文地址:http://blog.csdn.net/solstice/article/details/6527585 本文谈一谈我在学习网络编程方面的一些个人经验."网络编程& ...

  7. 谈一谈网络编程学习经验

    转自  陈硕 giantchen@gmail.com blog.csdn.net/Solstice 2011-06-06 PDF 版下载:https://github.com/downloads/ch ...

  8. 谈一谈网络编程学习经验(06-08更新)

    谈一谈网络编程学习经验 陈硕 giantchen@gmail.com blog.csdn.net/Solstice 2011-06-08 PDF 版下载:https://github.com/down ...

  9. 谈一谈网络编程的经验

    谈一谈网络编程学习经验 陈硕 giantchen@gmail.com blog.csdn.net/Solstice 2011-06-06 本文谈一谈我在学习网络编程方面的一些个人经验."网络 ...

  10. 谈一谈网络编程学习经验——陈硕

    陈硕 giantchen@gmail.com blog.csdn.net/Solstice 2011-06-06 PDF 版下载:https://github.com/downloads/chensh ...

最新文章

  1. 怎么看电脑屏幕尺寸_经常面对电脑怎么护眼?电脑族怎么保养身体?
  2. 以太坊知识教程------交易
  3. java虚拟机 第二章Java内存区域与内存溢出异常
  4. 跟我学Shiro目录贴
  5. Python 第三方模块之 numpy.random
  6. arduino使用oled代码_【惊不?】Arduino改造古董卡西欧计算器为作弊神器
  7. (转) 微软项目管理培训笔记(一)
  8. Hadoop生态圈-Hbase的API常见操作
  9. 一维装箱问题 java_c语言来实现贪心算法之装箱问题
  10. 从DOM到虚拟DOM——前端DOM发展史、性能与产能双赢背后的思考
  11. lucene bug的报告经历
  12. jQuery 事件源码定位
  13. zblog php获取文章的第一张图片,zblog 获取文章图片作缩略图的几种方式
  14. “个人云”复兴:智能化成为新趋势
  15. DB2 sqlCode错误信息
  16. 船务公司简称与缩写一览表
  17. php hprose扩展1.5.5,Laravel框架RPC解决方案--Hprose
  18. 错误的英语提示翻译 以及经常犯的无错误
  19. 解决IE浏览器打印iframe页面时字体等样式缩小的问题
  20. 计算机毕业设计Java房产中介管理系统(源码+系统+mysql数据库+lW文档)

热门文章

  1. 如何使用htmlq提取html文件内容
  2. 巩固好基础,才能学好Linux
  3. 最近在学C语言,非常痛苦,怎么办?
  4. 【Java工具类】使用Random类对象生成随机整数
  5. mysql for mac 使用_MySQL for Mac 安装和基本操作
  6. 如何在电脑桌面添加计算机网络等,如何实现在电脑桌面上添加文字提醒
  7. centeros7网络服务无法启动_Linux网络服务02——DHCP原理与配置
  8. 关于学习Python的一点学习总结(30->递归实例)
  9. Connections in Galaxy War
  10. 2020级HAUT新生周赛(四)@张承树专场