《Java语言》课件第10章.ppt

上传人(卖家):momomo 文档编号:5818491 上传时间:2023-05-11 格式:PPT 页数:24 大小:253KB
下载 相关 举报
《Java语言》课件第10章.ppt_第1页
第1页 / 共24页
《Java语言》课件第10章.ppt_第2页
第2页 / 共24页
《Java语言》课件第10章.ppt_第3页
第3页 / 共24页
《Java语言》课件第10章.ppt_第4页
第4页 / 共24页
《Java语言》课件第10章.ppt_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、第第10章章多线程机制多线程机制 1.1 Java线程的概念线程的概念 1.2 Java多线程编程方法多线程编程方法 1.3 线程的控制线程的控制1.4 线程资源的同步处理线程资源的同步处理1多进程多进程 多进程的缺点:多进程的缺点:进程切换开销大;进程切换开销大;进程间的通信很不方便。进程间的通信很不方便。2多线程多线程 多线程则指的是在单个程序中可以同时运行多个多线程则指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务不同的线程,执行不同的任务 线程切换的开销小线程切换的开销小。线程的状态线程的状态Java采用抢占式调度策略采用抢占式调度策略 下面几种情况下,当前线程会放弃下面几

2、种情况下,当前线程会放弃CPU:(1)当前时间片用完;)当前时间片用完;(2)线程在执行时调用了)线程在执行时调用了yield()或或sleep()方法主动放弃;方法主动放弃;(3)进行)进行I/O 访问,等待用户输入,导致线程阻塞;或者为等访问,等待用户输入,导致线程阻塞;或者为等候一个条件变量,线程调用候一个条件变量,线程调用wait()方法;()方法;(4)有高优先级的线程参与调度。)有高优先级的线程参与调度。线程的优先级用数字来表示,范围从线程的优先级用数字来表示,范围从110。主线程。主线程的默认优先级为的默认优先级为5 Thread.MIN_PRIORITY=1 Thread.MA

3、X_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 name););public Thread(ThreadGroup group,Runnable target););public Thre

4、ad(ThreadGroup group,String name););2、Thread类的主要方法类的主要方法 方法 功能CurrentThread()返回当前运行的Thread对象 start()启动线程 run()由调度程序调用,当run()方法返回时,该线程停止stop()使调用它的线程立即停止执行sleep(intn)使线程睡眠n毫秒,n毫秒后,线程可以再次运行suspend()使线程挂起,暂停运行Not Runnable resume()恢复挂起的线程,使处于可运行状态Runnable yield()将CPU控制权主动移交到下一个可运行线程2、Thread类的主要方法类的主要方法s

5、etName(String)赋予线程一个名字 getName()取得由setName()方法设置的线程名字的字符串getPriority()返回线程优先级setPriority(int)设置线程优先级join()当前线程等待调用该方法的线程结束后,再往下执行setDaemon(boolean)设置该线程是daemon线程还是用户线程,Daemon线程也称服务线程,通常编成无限循环,在后台持续运行。例例10-1 直接继承直接继承Thread类实现多线程类实现多线程 import java.util.*;class TimePrinter extends Thread int pauseTime;

6、/中间休息时间中间休息时间 String name;/名称标识名称标识 public TimePrinter(int x,String n)pauseTime=x;name=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);该方法是静态方法还该方法是静态

7、方法还是实例方法?是实例方法?例例10-1 直接继承直接继承Thread类实现多线程类实现多线程(续续2)static public void main(String args)TimePrinter tp1=new TimePrinter(1000,Fast Guy);tp1.start();TimePrinter tp2=new TimePrinter(3000,Slow Guy);tp2.start();【思考思考】不通过不通过start方法,直接执行方法,直接执行run()方法,会方法,会产生什么问题?产生什么问题?通过实现通过实现Runnable 接口编写多线程应用接口编写多线程应用

8、 通过通过 Thread 类的构造函数类的构造函数public Thread(Runnable target)可可以将一个以将一个Runnable 接口对象传递给线程,线程在调度时将自动接口对象传递给线程,线程在调度时将自动调用调用Runnable 接口对象的接口对象的run方法。方法。public class Thread implements Runnable private Runnable target;public Thread()public Thread(Runnable target).public void run()if(target!=null)target.run();

9、.例例10-2 计数按钮的设计计数按钮的设计 import java.applet.*;import java.awt.*;class countbutton extends Button implements Runnable int count=0;public countbutton(String s)super(s);public void run()while(count10000)try this.setLabel(+count+);Thread.sleep(int)(10000*Math.random();catch(Exception e)public class counta

10、pplet extends Applet public void init()setLayout(null);countbutton t1=new countbutton(“first”);t1.setBounds(30,10,80,40);add(t1);countbutton t2=new countbutton(“second”);t2.setBounds(130,10,80,40);add(t2);(new Thread(t1).start();(new Thread(t2).start();例例10-2 计数按钮的设计计数按钮的设计(续续1)10.3 线程的控制线程的控制 放弃运行(

11、放弃运行(Yielding)-yield()挂起(挂起(Suspending)-suspend()睡眠一段时间(睡眠一段时间(Sleeping)-sleep()阻塞(阻塞(Blocking)-I/O操作操作 10.3.5 关于用户线程和看守线程(关于用户线程和看守线程(Daemon)在程序中存在两种线程,用户级线程和后台看守线程在程序中存在两种线程,用户级线程和后台看守线程 public final boolean isDaemon()如果线程是看守线程,返回如果线程是看守线程,返回true,否则,返回,否则,返回false。public final void setDaemon(boolea

12、n on)设置线程为看守线程(设置线程为看守线程(on为为true),或用户线程(或用户线程(on为为false)只有程序存在用户级线程时,程序才能保持运行。如果所只有程序存在用户级线程时,程序才能保持运行。如果所有的用户级线程均终止了执行,则所有看守线程也将结束有的用户级线程均终止了执行,则所有看守线程也将结束运行。运行。执行执行main方法的线程是用户级线程,如果希望方法的线程是用户级线程,如果希望main方法方法结束时,终止整个程序的运行,则可以将所有线程指定为结束时,终止整个程序的运行,则可以将所有线程指定为看守线程。看守线程。10.4.1 临界资源问题临界资源问题 public cl

13、ass Stack int idx=0;char data=new char10;public void push(char c)synchronized(this)dataidx=c;idx+;public synchronized char pop()idx-;return dataidx;在执行该代码段时在执行该代码段时必须取得对象锁必须取得对象锁在执行该方法时必在执行该方法时必须取得对象锁须取得对象锁10.4.2 wait()和和notify()方法方法 这两个方法配套使用这两个方法配套使用 使用要求:使用要求:必须在必须在 synchronized 方法或块中调用。因为只方法或块中调

14、用。因为只有在同步代码段中才存在资源锁定。有在同步代码段中才存在资源锁定。这对方法直接隶属于这对方法直接隶属于Object 类类,而不是,而不是Thread类。类。采用采用wait和和notify可以解决很多临界访问控制问题可以解决很多临界访问控制问题 释放对象锁释放对象锁,进入,进入等待阻塞状态等待阻塞状态通知等待者执行通知等待者执行synchronized method1()/由线程由线程1调用调用.此处访问享数据此处访问享数据 available=true;notify();synchronized method2()由线程由线程2调用调用 while(!available)try wa

15、it();catch(Interrupted Exception e)此处访问共享数据此处访问共享数据 10.4.3 生产者消费者模型生产者消费者模型-生产者在生产了一个整数后,必须等待消费者生产者在生产了一个整数后,必须等待消费者访问处理该整数后才能生产下一个数访问处理该整数后才能生产下一个数 程序程序1:消费者:消费者 class Consumer extends Thread private ShareArea sharedObject;public Consumer(ShareArea shared)sharedObject=shared;public void run()int va

16、lue;do try Thread.sleep(int)(Math.random()*3000);catch(InterruptedException exception)value=sharedObject.getSharedInt();System.out.println(消费消费:+value);while(value!=10);程序程序2:生产者生产者 class Producer extends Thread private ShareArea sharedObject;public Producer(ShareArea shared)sharedObject=shared;publ

17、ic void run()for(int count=1;count=10;count+)try Thread.sleep(int)(Math.random()*3000);catch(InterruptedException exception)sharedObject.setSharedInt(count);System.out.println(生产:生产:+count);程序程序3:共享数据访问控制程序:共享数据访问控制程序 class ShareArea private int sharedInt=-1;private boolean writeable=true;public syn

18、chronized 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 sharedInt;程序程序4:测试主程序:测试主程序 public class SharedTest public static void main(String args)ShareArea sharedObject=new ShareArea();Producer p=new Producer(sharedObject);Consumer c=new Consumer(sharedObject);p.start();c.start();

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《Java语言》课件第10章.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|