java中多线程知识点剖析

上传人:今*** 文档编号:105850131 上传时间:2019-10-13 格式:DOCX 页数:15 大小:155.77KB
返回 下载 相关 举报
java中多线程知识点剖析_第1页
第1页 / 共15页
java中多线程知识点剖析_第2页
第2页 / 共15页
java中多线程知识点剖析_第3页
第3页 / 共15页
java中多线程知识点剖析_第4页
第4页 / 共15页
java中多线程知识点剖析_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《java中多线程知识点剖析》由会员分享,可在线阅读,更多相关《java中多线程知识点剖析(15页珍藏版)》请在金锄头文库上搜索。

1、JAVA中多线程的复习巩固一、 多线程的基本概念和使用1.1 进程和线程的基础知识1.1.1 进程和线程的概念进程:运行中的应用程序称为进程,拥有系统资源(cpu、内存)线程:进程中的一段代码,一个进程中可以有多段代码。本身不拥有资源(共享所在进程的资源)。在java中,程序入口被自动创建为主线程,在主线程中可以创建多个子线程。区别:1、是否占有资源问题2、创建或撤销一个进程所需要的开销比创建或撤销一个线程所需要的开销大。 3、进程为重量级组件,线程为轻量级组件多进程:在操作系统中能同时运行多个任务(程序)多线程:在同一应用程序中有多个功能流同时执行1.1.2 线程的主要特点1、不能以一个文件

2、名的方式独立存在在磁盘中;2、不能单独执行,只有在进程启动后才可启动;3、线程可以共享进程相同的内存(代码与数据)。1.1.3 线程的主要用途1、利用它可以完成重复性的工作(如实现动画、声音等的播放)。2、从事一次性较费时的初始化工作(如网络连接、声音数据文件的加载)。3、并发执行的运行效果(一个进程多个线程)以实现更复杂的功能1.1.4 多线程(多个线程同时运行)程序的主要优点1、可以减轻系统性能方面的瓶颈,因为可以并行操作;2、提高CPU的处理器的效率,在多线程中,通过优先级管理,可以使重要的程序优先操作,提高了任务管理的灵活性;另一方面,在多CPU系统中,可以把不同的线程在不同的CPU中

3、执行,真正做到同时处理多任务。1.2 线程的创建和启动其实看看API,从Thread的构造方法,就可以看出创建一个线程的方式:Thread()分配新的Thread对象。Thread(Runnabletarget)分配新的Thread对象。Thread(Runnabletarget,Stringname)分配新的Thread对象。Thread(Stringname)分配新的Thread对象。Thread(ThreadGroupgroup,Runnabletarget)分配新的Thread对象。Thread(ThreadGroupgroup,Runnabletarget,Stringname)分配

4、新的Thread对象,以便将target作为其运行对象,将指定的name作为其名称,并作为group所引用的线程组的一员。Thread(ThreadGroupgroup,Runnabletarget,Stringname, longstackSize)分配新的Thread对象,以便将target作为其运行对象,将指定的name作为其名称,作为group所引用的线程组的一员,并具有指定的堆栈大小。Thread(ThreadGroupgroup,Stringname)分配新的Thread对象。后面4个构造方法创建一个线程并加入到一个线程组中,但是创建线程的方式和前面的相似。java中创建一个线程有

5、两种方式:1、继承Thread类,重写run()方法,然后直接new这个对象的实例,创建一个线程的实例。然后调用start()方法启动线程2、实现Runnable接口,重写run()方法,然后调用new Thread(runnable)的方式创建一个线程,然后调用start()方法启动线程其实看Thread的源文件,发现它也是实现了Runnable接口的。public class Thread implements Runnable1.2.1 继承Thread类的方式public class Test1 public static void main(String args) System.o

6、ut.println(Thread.currentThread().getName();MyThread myThread = new MyThread();myThread.start();class MyThread extends Thread int i = 0;Overridepublic void run() while (i 10) System.out.println(this.getName() + i的值 + i);i+;1.2.2 实现Runnable接口public class Test1 public static void main(String args) Sys

7、tem.out.println(Thread.currentThread().getName(); Thread thread=new Thread(new MyRunnable(); thread.start(); class MyRunnable implements Runnable int i=0; Override public void run() while (i10) System.out.println(Thread.currentThread().getName()+i的值+i); i+; 注意:1)在继承Thread的方式中,可以使用getName()方法,来获得当前线程

8、的名字,这是因为在Thread类中,有这个方法。可是在实现Runnable方式中,却不可以使用this.getName(),因为Runnable接口没有这个方法(可以看出来,因为我们没有提示我们需要重写这个方法),所以只能通过Thread的静态方法Thread.currentThread()取得当前的Thread对象,在调用getName()方法,来取得当前线程的名字。2)对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。只有调用start()

9、方法才会启动新线程。1.2.3 两种方式的对比采用实现Runnable接口方式的多线程具有优势,一般都会使用这种方式:1)线程类只是实现了Runnable接口,还可以继承其他类。2)在这种方式下,可以多个线程共享一个Runnable target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。二、 线程的生命周期和状态控制2.1 线程的生命周期线程状态转换图:2.1.1 新建状态用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用sta

10、rt方法进入就绪状态(runnable)。注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadStateException异常。2.1.2 就绪状态处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它称为可运行池而不是可运行队列。因为cpu的调度不一定是按照先进先出的顺序来调度的),等待系统为其分配CPU。等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作称之为“cpu调度”。一旦获得CPU,线程就进入运行状态并自

11、动调用自己的run方法。提示:如果希望子线程调用start()方法后立即执行,可以使用Thread.sleep()方式使主线程睡眠一伙儿,转去执行子线程。2.1.3 运行状态处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。处于就绪状态的线程,如果获得了cpu的调度,就会从就绪状态变为运行状态,执行run()方法中的任务。如果该线程失去了cpu资源,就会又从运行状态变为就绪状态。重新等待系统分配资源。也可以对在运行状态的线程调用yield()方法,它就会让出cpu资源,再次变为就绪状态。当发生如下情况是,线程会从运行状态变为阻塞状态:1、线程调用sleep方法主动放弃所占用的

12、系统资源2、线程调用一个阻塞式IO方法,在该方法返回之前,该线程被阻塞3、线程试图获得一个同步监视器,但更改同步监视器正被其他线程所持有4、线程在等待某个通知(notify)5、程序调用了线程的suspend方法将线程挂起。不过该方法容易导致死锁,所以程序应该尽量避免使用该方法。当线程的run()方法执行完,或者被强制性地终止,例如出现异常,或者调用了stop()、desyory()方法等等,就会从运行状态转变为死亡状态。2.1.4 阻塞状态处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。在阻塞状态的线程不

13、能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。有三种方法可以暂停Threads执行:2.1.5 死亡状态当线程的run()方法执行完,或者被强制性地终止,就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。2.2 线程状态的控制Java提供了一些便捷的方法用于会线程状态的控制。.void

14、destroy()已过时。该方法最初用于破坏该线程,但不作任何清除。它所保持的任何监视器都会保持锁定状态。不过,该方法决不会被实现。即使要实现,它也极有可能以suspend()方式被死锁。如果目标线程被破坏时保持一个保护关键系统资源的锁,则任何线程在任何时候都无法再次访问该资源。如果另一个线程曾试图锁定该资源,则会出现死锁。这类死锁通常会证明它们自己是“冻结”的进程。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?。voidinterrupt()中断线程。voidjoin()等待该线程终止。voidjoin(longmillis)等待该线程终止的时间最长为millis毫秒。voidjoin(longmillis, intnanos)等待该线程终止的时间最长为millis毫秒 +nanos纳秒。voidresume()已过时。该方法只与suspend()一起使用,但

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号