JAVA篇_多线程零碎知识总结

原创 2017年08月25日 12:50:44

本文不仔细介绍多线程细节知识,而是总结一些易混淆的概念,阅读本文需要对多线程有一定了解,细节知识可以查看林炳文的博客


前置知识:

1.Runnable类和Thread类的使用,两者的关系。相同点和不同点

2.线程的状态转换

3.关键字Synchronized同步以及配套的wait(),notify()方法和notifyAll()方法

4.ReentrantLock & ReentrantReadWriteLock以及其内置的readlock和writeLock两个类的使用

5.sleep(),join(),currentThread(),yield(),wait(),notify(),notifyAll(),set/getPriority(),setName(),is/setDaemon()这些方法的作用是什么【加粗的是object方法,其他是thread方法】

ps:如果以上知识不清楚的,请查看林炳文的博客


1.sleep(),wait(),yield()方法都可以让当前线程暂停,区别如下:

sleep方法是让当前线程休眠,在休眠期间是绝对不会被调度器调用,休眠完了以后也不一定马上就执行线程,而是变为可运行(Runnable)状态,具体什么时候执行,看调度器;

yield方法是让当前线程暂停执行,重新返回到Runnable状态,然后在众多Runnable状态下的线程中(包括当前线程)选择同等级或者优先级更高的线程执行(理论上是这样,这个现象要在大批量的线程执行的时候才明显,是统计上的意义,并不是低优先级的一定不执行)。也就是当前线程可能再次被选中执行。

wait()方法是所有对象(object)的方法,,从语法角度来说就是Obj.wait(),Obj.notify必须在synchronized(Obj){...}语句块内。从功能上来说wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制


2. 对象锁(Syschronized的使用)

<工作流程> java中针对每一个对象,都有一个monitor,这个monitor的作用是监测并发代码的重入(也就是监测多线程执行同一处的代码),可以理解为监测临界资源,保证其线程安全。这个monitor在非多线程的代码处不起作用,但是在Syschronized内部(临界资源)这种会发生多线程访问的代码处就发挥作用。因为这个monitor对每个对象是唯一的,如果多个线程想要访问同一个对象的临界资源,那么只有得到这个对象的monitor使用权的才能访问,得到monitor使用权就是上锁(lock),访问期间,其他想要访问的就要排队等待(block),访问完了通过notifyAll或者notify释放锁(unlock)并通知等待的线程,然后调度器随机选择一个等待线程执行。

<总结> 每个对象唯一的monitor就是所谓的对象锁,从Syschronized开始就是上锁,一直到notifyAll或者notify调用,就是解锁。

PS:wait,notify,notifyAll都只能在Syschronized内部被调用,调用者是Syschronized(someObject)括号里面的上锁对象,wait是释放锁并暂停当前线程,但是后两者是释放锁并结束线程


3.线程池

<作用>

线程池的作用就是为了节省系统资源,降低开销产生的。用或不用都行。因为非线程池状态下,我们使用线程就会单独去开一个,用完了就销毁,这样的创建和销毁很浪费资源.线程池就可以单独开辟一个地方,执行完了的线程就回到池中等待复用(reuse),减少创建和销毁线程的开销。

<创建>

注意,下面方法都是static类方法,通过Executor类调用,返回的是ExecutorService对象


<线程池常用方法>

也就是ExecutorService类的对象的方法

添加线程到线程池:execute()方法和submit()方法,前者没有返回值,后者会返回一个Future<T>对象,也就是线程执行的结果

关闭线程池:shutdown()和shutdownNow(),前者会等添加到线程池的线程执行完再关闭,后者不等,直接关闭

PS:添加到线程池的只能是Runnable或者Callable对象,不能直接添加Thread对象

关于线程池的更多深入的,查看林炳文的博客


4.Future,Callable,FutureTask

详细参见林炳文博客


<Callable与Runnable以及FutureTask>

三者其实都是一样的,都是线程的具体的执行体,被传入Thread类作为参数或者传入线程池ExecutorService去执行;

不同:

<1>Callable的call方法有返回值,返回值封装在Future对象里面,通过future对象访问结果,Runnable没有返回值。

<2>FutureTask是对Callable接口的进一步封装,继承了Runnable接口以及Future接口,既是线程的执行体,又是结果的承载体,通过自身——FutureTask对象访问结果。


<ExecutorService 与 CompletionService>

前者作为参数传递给后者,后者内部是在前者的基础上添加了一个blockingQueue,解决了前者在通过Future的get方法(线程阻塞)获取结果的时候通过轮询顺序获取造成的资源浪费【参见图片】


多线程的知识框架图







版权声明:本文为博主原创文章,未经博主允许不得转载。

java中线程相关知识点大总结

一、Java线程:概念与原理 1、操作系统中线程和进程的概念 现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存...
  • xuweilinjijis
  • xuweilinjijis
  • 2013年05月03日 09:50
  • 5578

java多线程知识点总结

多线程(英语:multithreading) 每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程可以在程序里独立执行,由操作系统负责多个线程的调度和执行。 线程和进程的区别在...
  • THISISPAN
  • THISISPAN
  • 2016年08月03日 18:03
  • 609

【多线程】java多线程知识点总结

写在前面: 这篇文章是我最近看15个顶级Java多线程面试题及回答这篇帖子,根据文中所列问题在网上找的答案汇总。或许某些解答不尽如人意,欢迎大家来补充和指正。另外感谢这篇帖子的翻译者赵峰以及所有在网...
  • moshenglv
  • moshenglv
  • 2016年07月18日 17:20
  • 1283

java提高篇(一)拓展篇 java知识汇总---IO流的使用规律总结(含代码示例)浅显易懂

IO流的使用规律总结。 解决的问题,就是在开发过程中具体要使用哪个流对象的问题。 1,明确 数据源,数据汇(数据的目的) 其实就是在明确要使用的IO体系,InputStream Outp...
  • qiushi_1990
  • qiushi_1990
  • 2014年08月04日 21:36
  • 699

Java多线程知识小抄集(一)

本文主要整理博主遇到的Java多线程的相关知识点,适合速记,故命名为“小抄集”。本文没有特别重点,每一项针对一个多线程知识做一个概要性总结,也有一些会带一点例子,习题方便理解和记忆。 1. in...
  • u013256816
  • u013256816
  • 2016年05月05日 18:23
  • 13785

【php-零碎知识】defined & define & const & isset & function_exist()

define:定义一个常量defined:确定一个常量是否存在,存在返回true,否则返回false一般用法:$env = get_cfg_var('env'); defined('YII_ENV'...
  • csdn_azuo
  • csdn_azuo
  • 2018年01月18日 21:24
  • 17

vue 零碎知识点

一、Vue获取url链接的参数 this.$route.query.参数名 二、Vue标签绑定两个事件中间用;隔开...
  • hyupeng1006
  • hyupeng1006
  • 2017年12月14日 15:41
  • 65

[置顶] 国内首部Java多线程设计模式原创作品《Java多线程编程实战指南(设计模式篇)》已出版

国内首部Java多线程设计模式原创作品《Java多线程编程实战指南(设计模式篇)》已由电子工业出版社出版。本书从理论到实战,用生活化的实例和通俗易懂的语言全面介绍Java多线程编程的"三十六计"——多...
  • viscent_huang
  • viscent_huang
  • 2015年11月18日 11:21
  • 4415

Java基础之集合知识点总结一

集合----是用于存储对象的一个工具,集合和数组的特点
  • u011460827
  • u011460827
  • 2014年12月02日 12:40
  • 766

javaweb三大框架知识点总结

对于web编程的三大框架的知识点总结,分别叙述了struts , spring ,hibernate 的特点,希望对看到这篇文章的人有所帮助。...
  • wl1411956542
  • wl1411956542
  • 2016年09月24日 08:50
  • 5255
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA篇_多线程零碎知识总结
举报原因:
原因补充:

(最多只允许输入30个字)