java视频教程多线程程序设计_第1页
java视频教程多线程程序设计_第2页
java视频教程多线程程序设计_第3页
java视频教程多线程程序设计_第4页
java视频教程多线程程序设计_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2021/3/101第22讲 多线程程序设计o 线程的概念o 线程的创建o 线程调度与线程控制o 线程状态与生命周期2021/3/102多线程与并发编程o 把一个问题切割分成多个可独立运行的部分,从而提高程序的相应能力。o 在程序中,这些彼此独立运行彼此独立运行的部分称之为线程线程(thread),线程共享存储空间o JVM允许应用程序并发执行多个线程2021/3/103程序与进程o 程序n 是指令的集合,包括对数据的描述以及对数据数据的描述以及对数据的操作的操作,告诉计算机如何完成一个任务。o 进程n 进程通常被认为是一个程序的一次动态执行过一次动态执行过程程。n 一个进程具有一组完整的、私

2、有的基本运行时完整的、私有的基本运行时资源资源,特别是内存空间是独立的内存空间是独立的,不会与其他进程共享。2021/3/104线程o 线程是(一组),线程是处理器的调度单位。o 一个进程包含一个或多个线程。它们共享该进程的共享该进程的资源资源(如:内存和打开的文件等)。程序的执行从一个线程开始,这个线程称为主线程。o JAVA可以实现一个进程中多线程的多线程的”并发并发”执行执行,从而使一个进程”同时”执行多个任务。n在多处理器(或多核)系统中,这种并发是真实的。在单处理器系统中,这种并发是通过线程的交替执行来模拟的。2021/3/105线程的状态o 新建newo 就绪runnable o

3、运行runningo 阻塞lockingo 睡眠sleepingo 等待waitingo 中止dead2021/3/106线程状态及其变迁线程状态及其变迁终止终止就绪就绪(可运行可运行)运行运行睡眠睡眠拥塞拥塞等待等待新建新建start time oversleep stop wait time overLack of sourcereadyattemper2021/3/107创建可执行线程o 创建java.lang.Thread类的子类n 重写Thread父类的run()方法n 通过子类的实例化, 调用start()方法执行线程o 创建java.lang.Runnable接口的实现类n 实现

4、类必须实现run()方法n 用实现类的实例作为参数实现类的实例作为参数,调用Thread类的构造器类的构造器n 再通过调用Thread类的start()方法创建并运行线程2021/3/108Java线程类Java.lang.Threado Thread类的实例就是线程,用户通过编写Thread的子类来构造自己的线程。public UserThread extends Thread public void run()/override run方法 2021/3/109通过编写Thread的子类创建线程示例Class Xyz extends Thread int i ; /线程的数据定义线程的数据

5、定义 public void run( ) /线程的代码定义(覆盖线程的代码定义(覆盖run方法)方法)while( true)System.out.println(“Hello”+i+);if (i=5) break ; public class ThreadTest public static void main(String args )Thread t = new Xyz( ); /直接实例化直接实例化Thread的子类的子类Xyz创建线程创建线程t.start( ); /启动线程启动线程2021/3/1010Java线程接口java.lang.Runnableo Runnable的定

6、义:public interface Runnablevoid run(); 该接口只定义了一个run()方法。o 定义一个类实现Runnable接口 public UserRun implements Runnable public void run() /implement run方法 2021/3/1011通过实现Runnable接口创建线程o 定义一个类实现Runnable接口。n class UserRun implements Runnableo 将该类的实例作为参数传给Thread类的构造方法,从而创建一个线程对象,并通过该对象调用start方法启动线程执行。nRunnable

7、runner = new new UserRun();nThread t = new Thread(runner);nt.start();2021/3/1012通过实现Runnable接口线程创建示例Class Xyz implements Runnable int i ; /线程的数据定义线程的数据定义 public void run( ) /线程的代码定义线程的代码定义(实现实现run方法方法)while( true)System.out.println(“Hello”+i+);if (i=5) break ; public class ThreadTest public static v

8、oid main(String args )Xyz r= new Xyz( ); /线程体对象线程体对象Thread t = new Thread( r ); /以线程体对象为参数创建线程以线程体对象为参数创建线程t.start( ); /启动线程启动线程2021/3/1013线程的创建o 一个线程是Thread或其子类的对象。Thread的构造方法如下:public Thread()public Thread(String name)public Thread(Runnable target)public Thread(Runnable target,String name)public T

9、hread(ThreadGroup group,String name)public Thread(ThreadGroup group,Runnable target)public Thread(ThreadGroup group,Runnable target,String name)2021/3/1014两种线程创建方法的比较o 由于Java的单继承性单继承性,继承Thread类的子类无法同时继承其他类,而实现实现Runnable的接口不影的接口不影响继续继承其他类响继续继承其他类。o 继承Thread类实现的多线程,无法实现多个线程操纵同一个对象,实现实现Runnable接口的多线程,接

10、口的多线程,可以实现可以实现多个线程访问同一个对象多个线程访问同一个对象。2021/3/1015Thread类的常用方法o void interrupt()o static boolean interrupted()o void join()o void setDaemon(boolean on) o void setName(String name) o void setPriority(int newPriority) o static void sleep(long millis) o void start() o String toString()o static void yield

11、()2021/3/1016线程的启动o 新创建的线程不会自动运行,通过start()方法方法启动线程。nstart( )方法把线程置为可运行可运行(Runnable)状态状态,使得该线程可以参与调度,被Java虚拟机(JVM)运行。n注意:启动线程并不意味着该线程会立即执行,什么时候执行依赖于JVM的调度。o run()方法与start()方法的区别n调用调用start()方法是启动一个新的线程方法是启动一个新的线程,该线程将参与线程调度,当线程被调度执行时,会运行run()方法。 n而直接调用直接调用run()方法,只是将其作为普通方法执行方法,只是将其作为普通方法执行,并非开启一个新的线程

12、,达不到多线程并发运行的目的。注意:一个线程对象的注意:一个线程对象的start()方法只能执行一次!方法只能执行一次!2021/3/1017线程的调度o 选择线程执行的过程选择线程执行的过程就叫做线程调度。o JVM进行线程调度时采用抢先式调度抢先式调度算法:o 由优先级优先级决定线程执行的优先权n所有可运行线程按优先级保存在缓冲池中,线程的优先级越高,其被执行的概率越大;n共有十个优先级,每个优先级有一个等待池;nJVM先运行高优先级池中的线程,待该池空后才考虑低优先级线程;n一个时刻只能一个线程在运行。2021/3/1018线程调度策略详解o 优先级相同的线程有分时分时与与独占独占两种调

13、度方式。n在独占模式下,由JVM选定线程执行,直到其运行到不再可运行,或另一个更高优先级的线程抢在到JVM,成为可运行线程,该线程才不再运行。n在分时模式下,同一优先级的等待池中的线程轮流运行,每隔一定的时间,让出JVM的使用权。o 线程一般可用sleep()方法保证给其他线程让出运行时间。2021/3/1019线程的调度休眠o 休眠(sleep):使当前线程停止执行一段时间n 线程的状态由Runningsleepo sleep方法:static void sleep(long millis) n 作用:暂停当前执行的线程n 参数为停止的毫秒数毫秒数n 方法可能抛出InterruptedExc

14、eption异常o 注意:n 不处于运行状态的线程不能被暂停执行n 指定的时间结束后,线程将进入可运行状态可运行状态(不一定能马上恢复执行)。2021/3/1020多线程并发执行举例class TestMultiThreadspublic static void main(String args)Thread t1=new Thread(new T1(1);Thread t2=new Thread(new T1(2);t1.start();t2.start();System.out.println (main方法结束。方法结束。);class T1 implements Runnablepri

15、vate int id;public T1(int id) this.id=id;public void run()while(true)System.out.println(I am Thread +id+.);tryThread.sleep(int)(Math.random()*2000); catch(InterruptedException e) 2021/3/1021线程的调度优先级o 优先权(priority): 用于描述线程的重要性n 每个线程具有优先级:从低到高分为1-10共10个级别,默认的优先级为5。nThread类中定义了三个优先级常量:o Thread.MIN_PRIO

16、RITY : 1o Thread.MAX_PRIORITY : 10o Thread.NORM_PRIORITY : 5o 与优先级有关的方法nint getPriority() 获取线程优先级nvoid setPrioroty(int newPriority) 设置线程优先级2021/3/1022优先级joino 加入到某个线程n 如果某个线程t1,在另一个线程t2上调用join方法:t1.join();n 则t2将被挂起,直到目标线程t1执行结束才恢复t2的执行(runnable状态)。n public final void join()public final void join(lon

17、g millis)public final void join(long millis, int nanos)后者只等指定的时间,可能抛出后者只等指定的时间,可能抛出InterruptedException异常异常2021/3/1023线程中断o Interrupt:中断线程,并设置中断标志。o 相关方法:n void interrupt() : 使得线程提前结束执行,会产生InterruptedException异常。n boolean interrupted(): 测试当前线程是否被中断,如果是则返回true,并清除中断标志。2021/3/1024后台(daemon)线程o 线程可以分为后

18、台线程和用户线程后台线程和用户线程。n 如果一个程序只有后台线程在运行,则程序会立即退出。n 如果有用户线程在运行,则程序不会终止。后台线程通常用于为其他线程提供服务。o 线程默认为用户线程。在线程启动之前,可以用setDaemon方法将线程设置为后台线程.public final void setDaemon(boolean on)2021/3/1025线程组o 线程组是将线程进行分组管理的一种方法,一个线程组可以是一些线程和线程组的集合;每个Java线程都归属于一个线程组。o 线程组由java.lang中的ThreadGroup 类实现。o 线程属于某个线程组具有永久性,不允许改变。o 缺省线程组n在Java Application启动时,运行系统创建缺省的线程组,称为main 。所有未指定组的线程,均属于该组。n未指定组的线程,将属于其“父线程”所在线程组。2021/3/1026创建线程组o 通过ThreadGroup 类的构造方法可以创建线程组。n public ThreadGroup(String groupName)n public ThreadGroup(ThreadGroup parentGroup, String groupName)2021/3/1027指定线程所属的线程组o 通过线程的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论