java高级编程PPT演示文稿.ppt

上传人:rrsccc 文档编号:8764593 上传时间:2021-01-13 格式:PPT 页数:22 大小:178KB
返回 下载 相关 举报
java高级编程PPT演示文稿.ppt_第1页
第1页 / 共22页
java高级编程PPT演示文稿.ppt_第2页
第2页 / 共22页
java高级编程PPT演示文稿.ppt_第3页
第3页 / 共22页
java高级编程PPT演示文稿.ppt_第4页
第4页 / 共22页
java高级编程PPT演示文稿.ppt_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《java高级编程PPT演示文稿.ppt》由会员分享,可在线阅读,更多相关《java高级编程PPT演示文稿.ppt(22页珍藏版)》请在三一文库上搜索。

1、Java多线程,Java 线程模型,理解线程概念 进程的概念 线程的概念 线程与进程的区别和联系 一个进程在其执行过程中,可以产生多个线程。 在进程概念中,每一个进程的内部数据和状态都是完全独立的。但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。,线程是比进程更小的执行单位,是进程内部独立的,有序的指令流。由此,一个进程能包含多个并发执行的线程。线程是一种能够独立运行的子任务。 多线程是一种允许在程序中并发执行彼此间互相独立的多个线程机制。 多个线程的执行是并发的。 多个线程之间的代码是乱序执行的,

2、由此线程调度,同步等问题需要进行特殊处理。,1. 线程的生命周期,线程的5种状态及转换方法,1. 新生状态 当利用new运算符创建线程对象实例后,它仅仅作为一个对象实例存在,JVM没有为其分配CPU时间片等线程运行资源,该线程处于新生状态。 2. 可运行状态 在处于新生状态的线程中调用start()方法将线程的状态转换为可运行状态。这时,线程已经得到除CPU时间之外的其它系统资源,只等JVM的线程调度管理器按照线程的优先级对该线程进行调度,从而使该线程拥有能够获得CPU时间片的机会。 3. 运行状态 JVM的线程调度管理器选中一个可运行状态线程,使其占有CPU并转换为运行状态。运行状态的线程执

3、行自己的run()方法中的代码,直到调用其他方法而终止、或等待某资源而阻塞或完成任务而死亡。,4. 睡眠状态 处于运行状态的线程在某些情况下,如执行了sleep()方法,或等待I/O设备等资源,将让出CPU并暂时终止自己的运行,进入阻塞状态,也称为不可运行状态。 处于阻塞状态的线程是不可执行的,即使CPU空闲,也不能执行。只有当引起阻塞的原因被消除时,线程转入可运行状态,重新进入线程队列中排队等待运行,再次运行时从原来终止处继续运行。 5. 死亡状态 死亡状态是线程生命周期中的最后一个阶段。导致线程死亡的有2种情况:一是正常运行的线程完成了它的全部工作,这个任务完成的动作是由run()方法实现

4、的;另一个是线程被强制性地终止,如通过执行stop()方法来终止一个线程。 可以用isAlive()方法测试线程是否已启动。如果isAlive()方法返回false,表示该线程是新创建或已被终止;如果返回true,表示该线程已启动且未被终止,是可运行状态、运行状态或阻塞状态之一,但不能作进一步的分辨。,2. 线程控制,(1) start()方法 start()方法对应于启动操作 (2) stop()方法 stop()方法终止在任何状态的线程,使之转入到死亡状态 (3) sleep()方法 sleep()方法使线程暂停运行一段固定的时间。在休眠时间内,由于线程不能得到CPU 时间而不运行,指定的

5、时间一过,线程重新进入可运行状态。 public static void sleep(longmillis) throws InterruptedException public static void sleep(longmillis, intnanos) throws InterruptedException (4) yield()方法 yield()方法使得线程放弃当前分得的CPU时间,但是不使线程阻塞,即线程仍处于可运行状态,随时可能再次分得CPU时间,(5) wait()方法 wait()方法使得当前线程进入阻塞状态,直到被唤醒或等够了timeout指定的时间。注意:wait()等价

6、于wait(0),它使得线程永远等待直到被唤醒为止。 public final void wait(longtimeout) throws InterruptedException public final void wait(longtimeout, intnanos) throws InterruptedException public final void wait() throws InterruptedException (6) notify()方法和notifyAll()方法 notify()方法和notifyAll()方法对应于唤醒操作。 (7) suspend()方法和resu

7、me()方法 suspend()方法和resume()方法配套使用,suspend()方法使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume()方法被调用,才能使得线程重新进入可执行状态。,(8) interrupt()方法和interrupted()方法 interrupt()方法为线程设置一个中断标记,以便于run()方法运行时使用isInterrupted()方法能够检测到,此时,线程在sleep()之类的方法中被阻塞时,由sleep()方法抛出一个InterruptedException异常,然后捕获这个异常以处理超时。 (9) isAlive()方法 isAlive()

8、方法用来判断一个线程的run()方法是否还在执行,如果是在运行,则返回true,否则返回false。,3. 线程的创建,在Java中创建线程的方法有2种:一是通过创建Thread类的子类来实现,二是通过实现Runnable接口的类来实现。 用继承Thread类的子类或通过实现Runnable接口的类来创建线程无本质的区别。但是由于Java语言不允许多重继承,所以,如果类已经继承了别的类,这样它就不能再继承Thread了。这时,就要用Runnable接口的方式。,(1)Thread类与Runnable接口,Thread类用于创建和控制线程。一个线程必须从run()方法开始执行,而run()方法声

9、明在java.lang.Runnable接口中。 Runnable接口中只声明了一个run()方法。任何实现Runnable接口的对象都可以作为一个线程的目标对象。 一个线程对象必须实现run()方法来完成线程的所有活动,已实现的run()方法称为该对象的线程体。,Thread类在java.lang包中定义,Thread类的构造方法如下: (1) Thread () (2) Thread (Runnabletarget) (3) Thread (Runnabletarget, Stringname) (4) Thread (Stringname) (5) Thread (ThreadGroup

10、group, Runnabletarget) (6) Thread (ThreadGroupgroup, Runnabletarget, Stringname) (7) Thread (ThreadGroupgroup, Stringname) 任何实现Runable接口的对象对可以作为Thread类构造方法中的target参数,而Thread类本身也实现了Runable接口。因此,可以有2种方式提供run()方法来实现多线程。,(2)继承Thread类实现多线程,Thread类是一个具体的类,即不是抽象类,该类封装了线程的行为。要创建一个线程: Thread类包含了线程运行所需要的方法,当一

11、个类继承了Thread类后就可以在重写父类中的run()方法来执行指定的操作。 需要注意的是线程子类的对象需要通过调用自己的start()方法让线程执行,start()方法会自动调用run()方法。 。,例 通过继承Thread实现多线程,public class SimpleThread extends Thread int count= 1, number; public SimpleThread(int num) number = num; System.out.println(创建线程 + number); public void run() while(true) System.ou

12、t.println(线程 + number + :计数 + count); if(+count= 4) return; public static void main(String args) for(int i = 0; i 3; i+) new SimpleThread(i+1).start(); ,(3)通过Runnable接口实现多线程,用Runnable接口创建线程 实现线程的另外一种方法是通过使用Thread类的一个构造方法public Thread(Runnable target)来创建一个新的线程 ,其中创建参数target的类负责实现Runnable接口。 Runnable接

13、口中只有一个run( )方法,实现该接口的类必须实现接口中的run( )方法,在其中定义具体操作,然后将实现了Runnable接口的类的对象作为参数创建一个Thread类的对象,调用该Thread类对象的start( )方法启动线程。,例 通过实现Runnable接口实现多线程,public class Runnable1 implements Runnable int k=0; public Runnable1(int k) this.k = k; public void run() int i = k; while (i50) System.out.print(i+ ); i+=2; pu

14、blic static void main (String args) Runnable1 r1 = new Runnable1(1); /创建具有线程体的目标对象 Runnable1 r2 = new Runnable1(2); Thread t1=new Thread(r1); /以目标对象创建线程 Thread t2=new Thread(r2); t1.start(); t2.start(); for (int i=0;i40;i+) System.out.print(A ); ,两种线程实现方式的对比分析 通过继承Thread类来实现多线程的编程这种方法简单明了,但是它也有一个很大的

15、缺点,那就是如果相应的多线程处理类已经继承了一个类,便无法再继承Thread这个类,所以我们一般情况下采用Runnable接口的方法来实现多线程的编程。使用Runnable接口的来实现多线程在开发过程中能够在一个类中包容所有的代码,以便封装。但是使用Runnable接口的方法的缺点在于如果想创建多个线程并使各个线程执行不同的的代码,就必须创建额外的类,这样的话在某些情况下不如直接用多个类分别继承Thread紧凑。,18,线程的优先级,线程的优先级用数字来表示,范围从1到10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORITY。一个线程的缺省优先级是5,即Threa

16、d.NORM_PRIORITY。 int getPriority(); void setPriority(int newPriority);,19,class ThreadTest public static void main( String args ) Thread t1 = new MyThread(T1); t1.setPriority( Thread.MIN_PRIORITY ); t1.start( ); Thread t2 = new MyThread(T2); t2.setPriority( Thread.MAX_PRIORITY ); t2.start( ); Thread

17、 t3 = new MyThread(T3); t3.setPriority( Thread.MAX_PRIORITY ); t3.start( ); ,20,class MyThread extends Thread String message; MyThread ( String message ) this.message = message; public void run() for ( int i=0; i3; i+ ) System.out.println( message+ +getPriority() ); ,21,运行结果: T2 10 T2 10 T2 10 T3 10 T3 10 T3 10 T1 1 T1 1 T1 1,22,注意:并不是在所有系统中运行Java程序时都采用时间片策略调度线程,所以一个线程在空闲时应该主动放弃CPU,以使其他同优先级和低优先级的线程得到执行。,

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1