《JAVA学习课件7.ppt》由会员分享,可在线阅读,更多相关《JAVA学习课件7.ppt(35页珍藏版)》请在人人文库网上搜索。
1、Java 与 多线程,applet,Applet执行入口点 由于Browser有不同的消息要通知Applet,所以需要多入口。 public class AppletClass extends Applet public void init() start(). stop() destroy() paint(g) update(g) ,Applet的生命周期,生命周期称为Applet的主线程 一般由Browser或appletviewer自动调用,Applet的下载执行过程,WWW服务器 存放HTML,WWW服务器 存放.class,WWW浏览器 (Browser),解释执行字节码,HTML文。
2、件, String getParameter(String name),Applet方法,Applet的有关方法 getParameter(String):返回HTML中设定的值 getCodeBase():返回.class所在网址URL getDocumentBase():返回HTML的URL getAppInfo():返回作者、版本、版权信息 showStatus(String):在浏览器的状态栏输出信息 Image getImage(URLurl, Stringname) play(URLurl, Stringname),程序 - 进程 - 线程,程序是为完成特定任务、用某种语言编写的一。
3、组指令的集合。指一段静态的代码。 进程是程序的一次执行过程,是系统进行调度和资源分配的一个独立单位。,执行,就绪,等待,PCB,CPU,挂起,程序-进程-线程,线程是比进程更小的执行单位。 一个进程在其执行过程中,可以产生多个线程,形成多条执行线索。 每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。 一个线程有它自己的入口和出口,以及一个顺序执行的序列 线程不能独立存在,必须存在于进程中。 线程 轻量级的进程 系统负担小,主要是CPU的分配。,多线程,多线程是指同时存在几个执行体,按几条不同的执行线索共同工作的情况。 多线程 实现 单个进程中的并发计算。 各线程间共享进程空间的。
4、数据,并利用这些共享单元来实现数据交换、实时通信与必要的同步操作。 多线程的程序能更好地表述和解决现实世界的具体问题,是计算机应用开发和程序设计的一个必然发展趋势。,进程与多线程,传统进程,多线程进程,java与多线程,Java语言的一个重要功能特点就是内置对多线程的支持,它使得编程人员可以很方便地开发出具有多线程功能,能同时处理多个任务的功能强大的应用程序。 Java的所有类都是在多线程的思想下定义的,Java利用线程使整个系统成为异步。 每个Java程序都有一个隐含的主线程: application main 方法 Applet小程序,主线程指挥浏览器加载并执行java小程序。,线程的概念。
5、模型,线程控制 (虚拟CPU),线程代码,线程的三个组成部分,被操作数据,Thread类,Thread类综合了Java程序中一个线程需要拥有的属性和方法 当生成一个Thread类的对象后,一个新的线程诞生了。 每个线程都是通过目标对象的方法run()来完成其操作的。方法run() 称为线程体(线程方法)。 提供线程体的目标对象是在初始化一个线程时指明的。 任何实现了Runnable接口(实现run()方法)的类实例都可以作为线程的目标对象。,建立线程例,public class ThreadTest public static void main(String args) Job1 j = n。
6、ew Job1(); Thread t1 = new Thread(j) ; t1.start() ; class Job1 implements Runnable int I ; public void run() while (i50) System.out.println(i+) ; ,建立线程,线程控制 (虚拟CPU),线程代码,被操作数据,Thread的实例(t1),由实现了Runnable接口 的类(Job1)提供run方法,实现Runnable接口的类 (Job1)的实例 ( j ),生成与运行线程 方法1,class MyRun implements Runnable publ。
7、ic void run() 线程体 MyRun mr = new MyRun(); Thread t1 = new Thread(mr) ; t1.start(); /Thread实例用于线程控制 适合于:定义run()方法的类必须是其他类的子类。 该类既可以继承上级类的属性和方法,其run()方法又可以用线程的方式执行。,Thread类构造函数,Thread(Runnable target) 参数指定目标对象 Thread(Runnabletarget, Stringname ) Thread类本身就实现了Runnable接口。 Thread() 实例本身提供线程体 Thread(Strin。
8、g name) 指定线程名,MyThread mt = new MyThread(); mt.start();,class MyThread extends Thread public void run() 线程体 ,生成与运行线程 方法2,执行run()方法,建立线程,线程控制 (虚拟CPU),线程代码,被操作数据,实现Runnable接口的类 (Thread类的子类)的实例 ( mt),由实现了Runnable接口的类(Thread类的子类)提供 的run方法,Thread子类实例(mt),Thread类属性与方法,属性 MIN_PRIORITY 1 NORM_PRIORITY 5 MAX。
9、_PRIORITY 10 线程控制-对象方法 setPriority(intnewPriority) 改变线程的优先级 void start() 启动线程 String getName() 返回线程名 Boolean isAlive() 判断该线程是否在生命周期,Thread类静态方法,staticvoid sleep(毫秒): 令当前活动线程在指定时间段内放弃对CPU控制,使其他线程有机会被执行,时间到后重排队 产生例外InterruptedException staticvoid yield() 使当前执行线程重新排队,让出CPU给其他相同优先级的线程。 staticThread curr。
10、entThread() 返回当前线程,1-application,2-applet,线程状态,新建状态,new Thread(.),就绪状态,start(),等待状态,执行状态,I/O sleep(),CPU调度,run() 结束 stop(),yield(),消亡,I/O完成 sleep时间到,多个线程操作同一数据资源,会造成操作的不完整性,会破坏数据。 临界资源 临界区 解决办法 加锁,线程的同步与互斥,10,10,8,8,10,7,7,线程的同步与互斥,对象互斥锁 在Java中,每个对象有一个“互斥锁”,该锁可用来保证在同一时刻只能有一个线程访问该对象。 锁的使用过程(当一个线程要操作一。
11、个对象时),准备 加锁,对象是否 已加锁,加锁,进入 临界区 执行操作,解锁,否,是,线程的同步与互斥,加锁1 (临界区-方法) synchronized 方法名 进入该方法时加锁 加锁2(临界区-代码块) 方法名 . synchronized(this) /进入该代码段时加锁 . 一个线程为某对象加锁后,便对该对象具有了监控权。,3,线程的同步与互斥,进队,出队,生产者,消费者,线程的同步与互斥,主线程,线程1( ),线程2( ),操作对象,共享数据(队),synchronized 同步方法1(生产) wait() notify(),synchronized 同步方法2(消费) wait()。
12、 notify(),线程的同步与互斥,public final void wait() 方法 在当前线程中调用方法: 对象名.wait() 使当前线程进入等待(某对象)状态 ,直到另一线程对该对象发出notify(或notifyAll)为止。 调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁) 当前线程将释放对象监控权 ,然后进入等待队列(wait队列)。 在当前线程被notify后,换要重新获得监控权,然后从断点处继续代码的执行。,线程的同步与互斥,public final void notify() 方法 在当前线程中调用方法: 对象名.notify() 功能:唤醒等待该对象监控。
13、权的一个线程。 调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁) notifyAll() 唤醒wait队列中的所有线程,并把它门移入锁申请队列。,4,线程状态,新建状态,就绪状态,start(),等待状态,执行状态,CPU调度,run() 结束,消亡,等待状态 对象wait()池,等待状态 对象lock池,wait(),notify(),synchronized(),解锁,sleep() join(),yield(),线程调度,public static void sleep(longmillis) 当前进程休眠指定时间 public static void yield() 主动让。
14、出CPU,重新排队 public final void join() :等待某线程结束,5,等待另一线程结束,Runnable ot = new otheeThread() ; Thread tt = new Thread(ot) ; tt.start(); /执行自己的工作 try tt.join () ; catch( interruptedException e) . /继续做自己的事,让给另一线程,正在执行的线程将CPU让给其他具有相同优先级的线程,自己进入就绪状态重新排队。 yield,终止线程,public class R implement Runnable private bo。
15、olean timeToQuit=false ; /设标记 public void run() while (! timeToQuit ) public void stopRunning() timeToQuit=true; public class test public static void main(String args ) Runnable r = new R(); Thread t = new Thread(r) ; t.start() ; if () r.stopRunning() ; ,建立线程的两种方式,从严格的面向对象的设计观点,Thread类本意是封装虚拟的CPU。当虚拟CPU的功能需要修改时,才应该继承Thread类,并在其子类中编码。 单继承机制使得在某些场合不能继承Thread类(需要继承其他类,如Applet)。 优选的方式是: class Mythread impltment Runnable run(.) Runnable r = new Mythread() ; Thread t = new Thread( r ) ; t.start(),Thread.sleep() Thread.currentThread().getname(。