版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第10章多线程机制,1.1 Java线程的概念 1.2 Java多线程编程方法 1.3 线程的控制1.4 线程资源的同步处理,1多进程,多进程的缺点: 进程切换开销大; 进程间的通信很不方便。,2多线程,多线程则指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务 线程切换的开销小 。,线程的状态,Java采用抢占式调度策略,下面几种情况下,当前线程会放弃CPU: (1)当前时间片用完; (2)线程在执行时调用了yield() 或sleep() 方法主动放弃; (3)进行I/O 访问,等待用户输入,导致线程阻塞;或者为等候一个条件变量,线程调用wait()方法; (4)有高优先级的线程
2、参与调度。,线程的优先级用数字来表示,范围从110。主线程的默认优先级为5 Thread.MIN_PRIORITY=1 Thread.MAX_PRIORITY=10 Thread.NORM_PRIORITY=5,1、 Thread构造方法,public Thread (ThreadGroup group,Runnable target,String name); public Thread(); public Thread(Runnable target); public Thread(Runnable target,String name); public Thread(String nam
3、e); public Thread(ThreadGroup group,Runnable target); public Thread(ThreadGroup group,String name);,2、Thread类的主要方法,2、Thread类的主要方法,例10-1 直接继承Thread类实现多线程,import java.util.*;class TimePrinter extends Thread int pauseTime; /中间休息时间 String name; /名称标识 public TimePrinter(int x , String n) pauseTime = x; n
4、ame = n; ,例10-1 直接继承Thread类实现多线程(续1),public void run() while(true) try System.out.println(name + : + new Date(System.currentTimeMillis(); Thread.sleep(pauseTime); catch(Exception e) System.out.println(e); ,该方法是静态方法还是实例方法?,例10-1 直接继承Thread类实现多线程(续2),static public void main(String args) TimePrinter tp
5、1 = new TimePrinter(1000, Fast Guy); tp1.start(); TimePrinter tp2 = new TimePrinter(3000, Slow Guy); tp2.start(); ,【思考】不通过start方法,直接执行run()方法,会产生什么问题?,通过实现Runnable 接口编写多线程应用 通过 Thread 类的构造函数public Thread(Runnable target)可以将一个Runnable 接口对象传递给线程,线程在调度时将自动调用Runnable 接口对象的run方法。,public class Thread impl
6、ements Runnable private Runnable target; public Thread() public Thread(Runnable target) . public void run() if (target!=null) target.run(); . ,例10-2 计数按钮的设计,import java.applet.*;import java.awt.*;class countbutton extends Button implements Runnable int count=0; public countbutton(String s) super(s);
7、 public void run() while(count10000) try this.setLabel(+count+); Thread.sleep(int)(10000*Math.random(); catch(Exception e) ,public class countapplet extends Applet public void init() setLayout(null); countbutton t1 = new countbutton(“first”); t1.setBounds(30,10,80,40); add(t1); countbutton t2 = new
8、countbutton(“second”); t2.setBounds(130,10,80,40); add(t2); (new Thread(t1).start(); (new Thread(t2).start(); ,例10-2 计数按钮的设计(续1),10.3 线程的控制,放弃运行(Yielding)-yield() 挂起(Suspending) -suspend() 睡眠一段时间(Sleeping) -sleep() 阻塞(Blocking) -I/O操作,10.3.5 关于用户线程和看守线程(Daemon),在程序中存在两种线程,用户级线程和后台看守线程 public final b
9、oolean isDaemon()如果线程是看守线程,返回true,否则,返回false。 public final void setDaemon(boolean on)设置线程为看守线程(on为true),或用户线程(on为false) 只有程序存在用户级线程时,程序才能保持运行。如果所有的用户级线程均终止了执行,则所有看守线程也将结束运行。 执行main方法的线程是用户级线程,如果希望main方法结束时,终止整个程序的运行,则可以将所有线程指定为看守线程。,10.4.1 临界资源问题,public class Stack int idx=0; char data=new char10; p
10、ublic void push(char c) synchronized(this) dataidx=c; idx+; public synchronized char pop() idx-; return dataidx; ,在执行该代码段时必须取得对象锁,在执行该方法时必须取得对象锁,10.4.2 wait()和notify() 方法,这两个方法配套使用 使用要求: 必须在 synchronized 方法或块中调用。因为只有在同步代码段中才存在资源锁定。 这对方法直接隶属于Object 类,而不是Thread类。 采用wait和notify可以解决很多临界访问控制问题,释放对象锁,进入等待
11、阻塞状态,通知等待者执行,synchronized method1() /由线程1调用 . 此处访问享数据 available=true; notify(); synchronized method2() 由线程2调用 while(!available) try wait(); catch (Interrupted Exception e) 此处访问共享数据,10.4.3 生产者消费者模型 -生产者在生产了一个整数后,必须等待消费者访问处理该整数后才能生产下一个数,程序1:消费者 class Consumer extends Thread private ShareArea sharedObj
12、ect; public Consumer (ShareArea shared ) sharedObject = shared; ,public void run() int value; do try Thread.sleep( (int) ( Math.random() * 3000 ) ); catch( InterruptedException exception ) value = sharedObject.getSharedInt(); System.out.println( 消费: + value); while ( value != 10 ); ,程序2:生产者,class Pr
13、oducer extends Thread private ShareArea sharedObject; public Producer (ShareArea shared ) sharedObject = shared; public void run() for ( int count = 1; count = 10; count+ ) try Thread.sleep( ( int ) ( Math.random() * 3000 ) ); catch( InterruptedException exception ) sharedObject.setSharedInt(count )
14、; System.out.println( 生产: +count); ,程序3:共享数据访问控制程序,class ShareArea private int sharedInt = -1; private boolean writeable = true; public synchronized void setSharedInt( int value ) while ( !writeable ) try wait(); catch ( InterruptedException exception ) sharedInt = value; writeable = false; notify(); ,public synchronized int getSharedInt() while ( writeable ) try wait(); catch ( InterruptedException exception ) writeable = true; notify(); return sharedI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年上海市松江区人教版小学数学四年级上期中试卷及答案
- 急性肺动脉栓塞标准化筛查流程
- 2026年全国建设工程(公路养护、检修工)技术及理论知识考试题与答案
- 麻醉复苏室PACU护士护理理论考核试题及答案
- 2026年山东省诸城市高一历史下册期末考试考试卷及参考答案【模拟题】
- 2025年甘肃省临夏市高三历史上册期末考试考试卷含答案【培优A卷】
- 2026年湖北省赤壁市高二历史上册期末考试考试卷含答案(综合题)
- 2026年安徽省铜陵市高考考前模拟语文试题含解析
- 2025年陕西省兴平市高二历史下册期末考试模拟卷附完整答案【有一套】
- 2026年四川省什邡市高二历史下册期末考试自测卷(培优B卷)附答案
- 2026年绍兴市社区工作者(专职网格员)招聘考试试卷1含答案解析
- 第22课 《太空一日》课件(内嵌视频 ) 2025-2026学年统编版语文七年级下册
- 2026年安宁疗护护理考核试题及答案
- 2026年新疆维吾尔自治区事业单位考试真题及答案
- 医疗机构静脉用细胞毒性药物调配操作质量管理工作规范
- 2025年度中国展览数据统计报告
- 2025年兰州市事业单位《综合基础知识》真题及答案解析
- 2025-2026学年下学期九年级浙江省温州中考一模语文试卷(含答案)
- 2026入团考试新手备考专属题库及完整答案
- 仓库高处坠落事故案例分析
- 2024年江苏省苏州市常熟市小升初数学试卷(含答案解析)
评论
0/150
提交评论