




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JAVA多线程 线程的基本概念 线程的创建和启动 线程的调度和优先级 线程的状态控制 线程同步 JAVA SE基础 线程的基本概念 线程是一个程序内部的顺序控制流。 线程和进程的区别 每个进程都有独立的代码和数据空间(进程上下文),进程间的切换 会有较大的开销。 线程可以看成时轻量级的进程,同一类线程共享代码和数据空间, 每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。 多进程: 在操作系统中能同时运行多个任务(程序) 多线程: 在同一应用程序中有多个顺序流同时执行 nJava的线程是通过java.lang.Thread类来实现的。 n VM 启动时会有一个由主方法(public static void main() )所 定义的线程。 n 可以通过创建 Thread 的实例来创建新的线程。 n 每个线程都是通过某个特定Thread对象所对应的方法run( )来完成 其操作的,方法run( )称为线程体。 n 通过调用Thead类的start()方法来启动一个线程。 线程的创建和启动 可以有两种方式创建新的线程。 第一种 定义线程类实现Runnable接口 Thread myThread new Thead(target)/target为 Runnable接口类型。 Runnable中只有一个方法: public void run(); 用以定义线程运行体。 使用Runnable接口可以为多个线程提供共享的数据。 在实现Runnable接口的类的run方法定义中可以使用Thread的静 态方法: public static Thread currentThread() 获取当前线程的引 用。 第二种 可以定义一个Thread的子类并重写其run方法如: class MyThread extends Thead public void run() 然后生成该类的对象: MyThread myThreadnew MyThead() 使用那种好呢? 线程状态转换 方 法功 能 isAlive()判断线程是否还“活”着,即线程是否还未终止。 getPriority()获得线程的优先级数值 setPriority()设置线程的优先级数值 Thread.sleep()将当前线程睡眠指定毫秒数 join() 调用某线程的该方法,将当前线程与该线程“合并”,即等待 该线程结束,再恢复当前线程的运行。 yield()让出CPU,当前线程进入就绪队列等待调度。 wait()当前线程进入对象的wait pool。 notify()/ notifyAll() 唤醒对象的wait pool中的一个/所有等待线程。 线程状态转换 sleep / join / yield 方法 sleep方法 可以调用Thread的静态方法: public static void sleep(long millis) throws InterruptedException 使得当前线程休眠(暂时停止执行millis毫秒)。 由于是静态方法,sleep可以由类名直接调用: Thread.sleep() join方法 合并某个线程 yield方法 让出CPU,给其他线程执行的机会 线程模式 两种线程模式: 协作式:一个线程保留对处理器的控制直到它自己决定 放弃 速度快、代价低 用户编程非常麻烦 抢先式。系统可以任意的从线程中夺回对CPU的控制 权,再把控制权分给其它的线程 。 两次切换之间的时间间隔就叫做时间片 效率不如协作式高 ,OS核心必须负责管理线程 简化编程,而且使程序更加可靠 多数线程的调度是抢先式的。 线程的优先级别 Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有 线程。线程调度器按照线程的优先级决定应调度哪个线程来执行。 线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级 是5。 Thread.MIN_PRIORITY = 1 Thread.MAX_PRIORITY = 10 Thread.NORM_PRIORITY = 5 使用下述线方法获得或设置线程对象的优先级。 int getPriority(); void setPriority(int newPriority); 不同平台上的优先级 Solaris:相同优先级的线程不能相互抢占对方的cpu时间。 windows:可以抢占相同甚至更高优先级的线程的cpu时间 临界资源问题(1) 两个线程A和B在同时操纵Stack类的同一个实例(堆栈),A 正在往堆栈里push一个数据,B则要从堆栈中pop一个数 据。 class Stack int idx=0; char data = new char6; public void push(char c) dataidx = c; idx+; public char pop() idx-; return dataidx; 临界资源问题(2) 1. 操作之前 data = | a | b | | | | | idx=2 2. A执行push中的第一个语句,将c推入堆栈; data = | a | b | c | | | | idx=2 3. A还未执行idx+语句,A的执行被B中断,B执行pop方 法,返回c: data = | a | b | c | | | | idx=1 4. A继续执行push的第二个语句: data = | a | b | c | | | | idx=2 最后的结果相当于c没有入栈,产生这种问题的原因在于 对共享数据访问的操作的不完整性。 线程同步 public class Test implements Runnable Timer timer = new Timer(); public static void main(String args) Test test = new Test(); Thread t1 = new Thread(test); Thread t2 = new Thread(test); t1.setName(“t1“); t2.setName(“t2“); t1.start(); t2.start(); public void run() timer.add(Thread.currentThread().getName(); class Timer private static int num = 0; public void add(String name) num +; try Thread.sleep(1); catch (InterruptedException e) System.out.println(name+“, 你是第“+num+“个使用timer的线程“); Synchronized总结 无论synchronized关键字加在方法上还是对象上,它取得的锁都是锁在了对 象上,而不是把一段代码或函数当作锁而且同步方法很可能还会被其他线 程的对象访问。 每个对象只有一个锁(lock)与之相关联。 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避 免无谓的同步控制。 搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程 程序。 还有一些技巧可以让我们对共享资源的同步访问更加安全: 定义private 的instance变量+它的 get方法,而不要定义 public/protected的instance变量。如果将变量定义为public,对象在外 界可以绕过同步方法的控制而直接取得它,并改动它。 如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法 仍然不安全,因为当外界对象通过get方法拿到这个instance对象的引用 后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很 危险。 这个时候就需要将get方法也加上synchronized同步,并且,只 返回这个private对象的clone()这样,调用端得到的就是对象副本的引 用了。 线程同步 在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性。每 个对象都对应于一个可称为“互斥锁”的标记,这个标记保证在任一时刻, 只能有一个线程访问该对象。 关键字synchronized 来与对象的互斥锁联系。当某个对象synchronized修 饰时,表明该对象在任一时刻只能由一个线程访问。 synchronized(this) num +; try Thread.sleep(1); catch (InterruptedException e) System.out.println (name+“, 你是第“+num+“个使用timer的线程“); synchronized 的使用方法: synchronized 还可以放在方法声明中,表示整个方法为同步方法,例如: synchronized public void add(String name) 面试:Wait sleep区别 来源不同 Sleep是Thread提供的方法 Wait继承自Object
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年绿色搬迁工程环保验收服务协议
- 二零二五年度建筑工程防渗漏质量检测协议
- 二零二五年度茶园灌溉设施租赁合同协议
- 2025年辽宁住院医师辽宁住院医师全科医学考试近5年真题附答案
- 2025版冷藏货物安全运输服务合同
- 2025年防盗门产品研发与市场推广合同
- 二零二五年旅游车辆雇用与导游服务合作协议
- 2025版石材进口及国内加工大理石供应合同
- 二零二五年度铲车租赁及安全操作培训服务合同
- 2025版文化传播服务外包合同范本
- 化学品安全技术说明书MSDS(液氨)
- 全国初中音乐优质课说课大赛一等奖《走进影视歌曲音乐》说课课件
- 境外安全风险管理培训课件
- 住宿流水单免费模板
- 北京大学金融伦理学 (3)课件
- BWD3K130干式变压器温控器说明书
- 公司引进战略投资者计划书课件
- 六西格玛黑带C阶段考试题
- HoloSens IVS3800智能视频存储介绍
- HSE管理体系审核员培训考核测试试卷
- 08S305-小型潜水泵选用及安装图集
评论
0/150
提交评论