黑马程序员——线程
来源:互联网 发布:日式豚骨叉烧拉面 淘宝 编辑:程序博客网 时间:2024/06/05 18:50
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
6.1. 概述
进程:正在运行的程序,每个进城都有一个执行顺序,该顺序是一个执行路径,或叫一个控制单元
线程:是进程中一个独立的控制单元,线程控制进程的执行,一个进程至少有一个执行的线程
JVM:java虚拟机就是一个多线程的机制,主线程运行,垃圾回收机制也在同时运行
Thread类:extends Object implements Runnable,线程类继承Thread
Runnable接口:里面有一个run方法,线程类实现Runnable接口
6.2. 线程的运行状态
创建-->运行:调用start方法
运行-->冻结:调用sleep方法
冻结-->运行:sleep时间到了,自动释放
运行-->冻结:调用wait方法
冻结-->运行:调用notify方法
运行-->消亡:调用stop方法或者run方法结束
冻结-->消亡:调用stop方法
6.3. 线程的实现
1.继承Thread类
复写run方法
生成的对象调用start方法,通过start方法调用Thread内部的run方法
2.实现Runnable接口
步骤:
定义类,实现Runnable接口
覆盖接口中run方法
通过Thread类建立对象
将Runnable子类对象传给Thread对象
用Thread类的start()方法运行线程
6.4. 线程安全问题
多条数据同时操作统一线程的共享数据,另一线程参与进来,导致数据错误,如何解决?
利用想成同步机制。
同步代码块:两个或两个以上线程,并且线程用的是统一对象锁
弊端是每次都要判断锁,比较耗费资源
synchronized(对象){
//同步内容
}
同步函数:将synchronized直接写在函数上,与代码块的功能相同
public synchronized 返回值 函数名(){}//此时同步对象是:类名.class
6.5. 多线程死锁
死锁:线程之间相互调用相互等待
如何解决死锁相关问题?
利用等待唤醒机制,增加标志位进行对锁的控制,利用Object类中的方法wait和notify进行控制。Notify:唤醒的是第一个等待的线程。
为什么将wait和notify定义在Object中?
因为在操作同步线程时,都必须标识他们所操作线程持有的锁,只有同一锁上等待的线程,才可以被同一锁上的notify唤醒,而锁可以是任意对象,所以可以被任意对 象啊调用。
6.5. 生产者消费者问题
利用jdk1.5的新特性,Lock替代了synchronized,Condition替代了Object类中的方法。实现Condition接口,将Object类里面的wait、notify、notifyAll方法分解成截然不同的对象,,一个锁上面可以有多个condition对象。
Lock-->synchronized,lock中的newCondition方法生成新的锁对象
Wait-->await
Notify-->singles,singleAll
源代码参考:
classResource{ privateString name; private int count =0; Locklock = newReentrantLock(); privateBoolean flag = false; Conditioncon_pro = lock.newCondition(); Conditioncon_cus = lock.newCondition(); public voidsetRes(String name) throwsException{ lock.lock(); try { while(flag){ con_pro.await(); } count = count+1; System.out.println(Thread.currentThread().getName()+name+(count)); flag = true; con_cus.signal(); }finally{ lock.unlock(); } } public voidshowRes(String name)throwsException{ lock.lock(); try{ while(!flag){ con_cus.await(); } System.out.println(Thread.currentThread().getName()+name+count); flag = false; con_pro.signal(); }finally{ lock.unlock(); } }}classProducer implements Runnable{ privateResource res; publicProducer(Resource res){ this.res =res; } @Override public voidrun() { // TODOAuto-generated method stub while(true){ try { res.setRes("生产者"); }catch (Exception e) { // TODOAuto-generated catch block e.printStackTrace(); } } } }classConsumer implements Runnable{ privateResource res; publicConsumer(Resource res){ this.res =res; } @Override public voidrun() { // TODOAuto-generated method stub while(true){ try { res.showRes("消费者"); }catch (Exception e) { // TODOAuto-generated catch block e.printStackTrace(); } } }}
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com
- 黑马程序员—线程
- 黑马程序员 — 线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员——线程
- 黑马程序员—线程小结
- 黑马程序员—线程技术
- pentadactyl 配置文件
- Eclipse导入Android工程时提示Invalid project description的解决
- VS2010自动关闭(崩溃)的解决方法(新建工程)
- HKCR HKCU HKLM HKU HKCC 的含义
- 浅谈-面向对象
- 黑马程序员——线程
- Oracle pl/sql的进阶--控制结构(分支,循环,控制)
- lua中的面向对象模拟,类,继承,多态
- android 判断 sdcard 是否是 emulated
- jquery iframe操作
- Mysql相关操作备份
- 北大ACM暑期培训课程目录
- sqoop导入数据时间日期类型错误
- DB2内存使用过高优化