




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
线程:解决多个代码段同时执行问题OS-多进程(QQ/飞信/PS)JVM是一个进程,包括多线程,main方法是主线程多进程之间内存独立,多线程之间,堆(对象)内存共享,栈内存独立.CPU在同一时间点上只能运行一个线程,人的感觉是时间段,多线程是针对在时间段,但是时间很短,人反映不过来,认为是并行同时的.线程同时运行,不依赖于其他的线程(不代表不影响,有可能影响其他线程)Java线程需要虚拟CPU(CPU时间片)代表一个类Thread 代码和数据代表一个接口Runnable (Thread类已经实现了Runnable接口,具备了线程三个要素)写线程步骤1.继承thread 2.重写run方法线程中过时方法禁止使用!Thread.currentThread()用于在Runnable子类中取得当前线程名守护线程的存在依赖于其它非守护线程.(类似寄生虫.寄主死掉,自己也会再消耗完时间片死掉)gc就是个守护线程,run()不启动新的线程,只有start方法可以启动新的线程。 + start()使该线程开始执行;Java 虚拟机调用该线程的 run 方法。同一线程只能启动一次,再次启动会异常booleanisDaemon()测试该线程是否为守护线程(后台线程)voidsetDaemon(booleanon)将该线程标记为守护线程或用户线程。voidjoin(longmillis) 等待该线程终止的时间最长为 millis 毫秒。(等待该线程终止。把A线程加入到B线程) 在a中调b.join(),则a停止,b运行.除非b结束或join()时间到staticvoidyield()让位 只向优先级高的或平级让位,优先级高抢的快,受优先级影响暂停当前正在执行的线程对象,并执行其他线程。staticvoidsleep(longmillis)在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。/*针对堆内存共享,同时操作同一片区域,并行访问问题*/1. 同步方法 在返回类型前加synchronized void method()2.同步语句块 在需要同步的语句中用synchronized()括起来void method()synchronized(this)this代表对象,同步时必须只能是同一个对象,所以同步的效率低,避免使用同步要尽量使用最小的单位封锁,体现原子性(不可再分)*所有的对象在内存中都有对象锁,同步依靠对象锁完成*释放锁的情况:1. 同步语句块结束2.执行break,return 跳出同步语句块 3.调用对象.wait()4.在同步语句块中未捕获的异常死锁:某线程不释放对象锁而导致程序死掉避免死锁原则:1.顺序上锁(A-B-C-D)2.不要回调3.反向解锁(D-C-B-A)需要使用同步的情况:1. 并行访问出问题,必须同步2. synchronized(对象)利用对象锁可以实现同步3. 同步时避免死锁StringBuffer线程安全效率低就是因为是同步的,方法由synchronized修饰的StringBuilder没有Collections中包括了同步list map set的方法,返回同步以后的集合static ListsynchronizedList(Listlist) 返回指定列表支持的同步(线程安全的)列表。static MapsynchronizedMap(Mapm) 返回由指定映射支持的同步(线程安全的)映射。static SetsynchronizedSet(Sets) 返回指定 set 支持的同步(线程安全的)set。线程状态图wait()和notify()/notityAll()都是Object的方法实例package Threads;/*针对堆内存共享,同时操作同一片区域,并行访问问题*/public class Account implements Runnable private int money=2000;/账户余额public void run()/取钱过程synchronized(this)/同步关键字,让线程并行变成串行/4.t1运行到对象锁池拿到锁回到就绪-运行-阻塞-就绪-运行-消亡释放锁/在t1回到就绪时,t2就绪-若运行-对象锁池(等t1消亡才能拿到对象锁出去)-就绪-运行-堵塞-就绪-运行-消亡System.out.println(Thread.currentThread().getName()+ );int temp=money;/远端取的钱数从数据中心取余额temp=temp-800;/取800try Thread.sleep(1000);/模拟网络延迟 catch (InterruptedException e) e.printStackTrace();money=temp;/写回数据中心System.out.println(Thread.currentThread().getName()+over);public static void main(String args) throws Exception Account a=new Account();Thread t1=new Thread(a);Thread t2=new Thread(a);/1.此时三个线程t1t2新建 主线程运行t1.start();t2.start();/同时取钱/2.t1t2就绪,主线程可能运行Thread.sleep(3000);/3.若主线程之前运行到此处sleep阻塞 main()堵塞System.out.println(a.money);/不加同步关键字还是1200/t1 开始2000 取完1200 由于网络延迟数据还没写到数据中心 / t2开始执行也是开始2000 取完还是1200调wait() 1.先释放对象锁2.进等待池出等待池1.调notify()/nontifuAll()2.或者wait()时间到1. 互斥锁(互相排斥)2. 读写锁 所有只读共享锁 所有写线程独占锁Runnable-被Callable取代Thread-被ExecutorService取代5.0新线程实现步骤1.写Callable子类 实现call()2.Executors.newXXThreadPool()返回ExecutorService对象3.调ExecutorService 实现(Callable的子类对象) 用submit()启动4. ExecutorService需要shutdown()来关闭import java.util.concurrent.*;public class TestCallable implements Callable Overridepublic Object call() throws Exception for(int i=0;i10;i+)Thread.sleep(1000);System.out.println(i);return null;public static void main(String args) ExecutorService es=Executors.newCach
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 野生动物传染病检疫学
- 山东省济宁市2025年高考模拟考试政治试题及答案(济宁三模)
- 化工新质生产力
- 2025年上半年教师学期个人工作总结模版
- 玉林消防考试题及答案解析
- 幼儿消防测试题目及答案
- 邮政计算机考试题及答案
- 银行求职面试题目大全及答案
- 宜昌公务员考试题及答案
- 医惠三网合一的医疗物联网基础架构平台解决方案
- 员工手册070509
- 罗斯公司理财Chap004全英文题库及答案
- 切尔诺贝利核事故永远不能忘却的事故(课堂PPT)
- 安装调试培训及验收方案
- 劳动合同法培训ppt课件
- 公制螺纹公差速查表
- 交通运输水运工程造价定额中心
- 鹊桥仙(公开课课件)(苍柏书屋)
- 大班绘本《变色龙卡罗》
- 英威腾高压变频器CHH100说明书_图文
- 军人申请结婚报告表函调表
评论
0/150
提交评论