




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章 Java多线程机制,6.1 Java中的线程 6.2 线程的创建 6.3线程的常用方法 6.4线程同步 6.5在同步方法中使用wait()、notify 和notifyAll()方法 6.6挂起、恢复和终止线程,6.1 Java中的线程,程序是一段静态的代码,它是应用软件执行的蓝本。 进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。 线程:是一个程序内部的顺序控制流。(既一个程序中不同的执行的路径) 线程与进程的区别: 1.进程:每个进程都有独立的代码和数据空间(进程上下文) ,进程切换的开销大。 2.线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。 3.多进程:在操作系统中,能同时运行多个任务程序。 4.多线程:在同一应用程序中,有多个顺序流同时执行。Java的多线程就是在操作系统每次分时给Java程序一个时间片的CPU时间内,在若干个独立的可控制的线程之间切换。,6.1 Java中的线程,线程的状态与生命周期,新建 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。此时它已经有了相应的内存空间和其他资源。 运行 线程创建之后就具备了运行的条件,一旦轮到它来享用CPU资源时,即JVM将CPU使用权切换给该线程时,此线程的就可以脱离创建它的主线程独立开始自己的生命周期了(即run方法执行的过程)(但需调用start()方法通知JVM又有一个新线程排队)。 中断 有多种原因的中断:CPU资源从当前线程切换给其他线程、执行了sleep(int millsecond)方法、执行了wait()方法等进入等待状态 。 死亡 run方法结束 。,线程的状态与生命周期,6.2线程的创建,可以有两种方式创建新的线程: 第一种: 定义线程类MyThread实现Runnable接口; MyThread target=new MyThread(); Thread t1=new Thread(target);/target为实现接口Runnable类类型 Runnable中只有一个方法:public void run();/用以定义线程运行体。 第二种: 定义一个Thread的子类并重写其run方法如: class MyThread extends Thread public void run() 然后生成该类的对象: MyThread t1=new MyThread();,public class TestThread1 public static void main(String args) R1 r=new new R1(); Thread t=new Thread( r); t.start(); for(int i=0;i10;i+) System.out.println(“Main Thread:-”+i); ,class R1 implements Runnable public void run() for(int i=0;i10;i+) System.out.println(“R1:-”+i); ,6.2线程的创建,方法一:实现接口创建线程,6.2线程的创建,public class TestThread2 public static void main(String args) R1 t=new new R1(); t.start(); for(int i=0;i10;i+) System.out.println(“Main Thread:-”+i); ,class R1 extends Thread public void run() for(int i=0;i10;i+) System.out.println(“R1:-”+i); ,方法二:创建线程的子类,6.3线程的常用方法,1start() 线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。 2run() Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。当run方法执行完毕,线程就变成死亡状态。,3.currentThread() 方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。 4.intertupt() 方法经常用来“吵醒”休眠的线程。当一些线程调用sleep方法处于休眠状态时,一个占有CPU资源的线程可以让休眠的线程调用interrupt 方法“吵醒”自己 . 挂起一个线程suspend(过时) 停止一个线程stopdestroy(过时),6.3线程的常用方法,6.3线程的常用方法,6.3线程的常用方法,import java.util.*; public class TestSleep public static void main(String args ) MyThread thread=new MyThread(); thread.start(); try Thread.sleep(5000); catch(InterruptedException e) errupt(); class MyThread extends Thread public void run() while(true) System.out.println(“=“+new Date(); try Thread.sleep(1000); catch(InterruptedException e) return; ,6.3线程的常用方法,sleep()与interrupt(),6.3线程的常用方法,join()方法,public class TestJoin public static void main(String args ) MyThread1 thread1=new MyThread1(“t1“); thread1.start(); try thread1.join(); catch(InterruptedException e) for(int i=1;i=5;i+) System.out.println(“i am main thread“); class MyThread1 extends Thread MyThread1(String s) super(s); public void run() for(int i=1;i=5;i+) System.out.println(“i am “+getName(); try Thread.sleep(1000); catch(InterruptedException e) return; ,6.3线程的常用方法,yield()方法,public class TestYield public static void main(String args ) MyThread2 t1=new MyThread2(“t1“); MyThread2 t2=new MyThread2(“t2“); t1.start(); t2.start(); class MyThread2 extends Thread MyThread2(String s) super(s); public void run() for(int i=1;i=50;i+) System.out.println(getName()+“:“+i); if(i%10=0) yield(); ,public class Example9_9 public static void main(String args) A a=new A(); a.student.start(); a.teacher.start(); class A implements Runnable Thread student,teacher; A() teacher=new Thread(this); student=new Thread(this); teacher.setName(“王教授“); student.setName(“张三“); ,public void run() if(Thread.currentThread()=student) try System.out.println(student.getName()+“正在睡觉,不听课“); Thread.sleep(1000*60*60); catch(InterruptedException e) System.out.println(student.getName()+“被老师叫醒了“); System.out.println(student.getName()+“开始听课“); else if(Thread.currentThread()=teacher) for(int i=1;i=3;i+) System.out.println(“上课!“); try Thread.sleep(500); catch(InterruptedException e) errupt(); /吵醒student ,6.3线程的常用方法,下述方法可以对优先级进行操作:(线程的优先级高,运行的机会多) int getPriority(); /得到线程的优先级 void setPriority(int newPriority);/当线程被创建后,可通过此方法改变线程的优先级,线程的优先级,6.3线程的常用方法,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 t3 = new MyThread(“T3”); t3.setPriority( Thread.MAX_PRIORITY ); t3.start( ); ,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() ); ,优先级的例子:,6.4线程同步,线程同步问题 线程同步是指几个线程都需要调用一个同步方法(使用关键字synchronized修饰的方法) 同步机制 当一个线程A使用一个synchronized修饰的方法时,其他线程想使用这个方法时就必须等待,直到线程A 使用完该方法 (除非线程A使用wait主动让出CUP资源),6.4线程同步,public class Test implements Runnable Timer timer=new Timer(); public static void main(String args) Thread t1=new Thread(this); Thread t2=new Thread(this); t1.setName(“t1“); t2.setName(“t2“); t1.start(); t2.start(); public void run() timer.add(Thread.currentThread().getName(); class Timer private static int num=0; public void add(String name) num+; try Thread.sleep(1); catch(InterruptedException e) System.out.println(name+“,你是第“+num+“个使用timer的线程“); ,6.4线程同步,6.5在同步方法中使用wait()、notify 和notifyAll()方法,等待与通知 一个线程在使用的同步方法中时,可能根据问题的需要,必须使用wait()方法使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。 其它线程如果在使用这个同步方法时如果不需要等待,那么它用完这个同步方法的同时,应当执行notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。,6.6挂起、恢复和终止线程,有时候两个线程并不是同步的,即不涉及都需要调用一个同步方法,但线程也可能需要暂时的挂起。 挂起 所谓挂起一个线程就是让线程暂时让出CPU的使用权限,暂时停止执行,但停止执行的持续时间不确定,因此不能使用sleep方法暂停线程。挂起一个线程需使用wait方法,即让准备挂起的线程调用 wait 方法,主动让出CP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 指南专业标准试题及答案
- 2026届安徽省合肥市普通高中学业水平选择性考试物理模拟检测试卷(五)
- 知识社群知识产业市场调查及技术创新
- 【高中语文】《论语》十二章+课件+统编版高二语文选择性必修上册
- 2024-2025学年山东省临沂市郯城县八年级(上)期末数学试卷(含答案)
- 建筑局部元素采集方案设计
- 加强校园维稳安全教育
- 山东省淄博市周村区第一中学2024-2025学年六年级下学期3月月考生物试题(含答案)
- 混凝土表面病害施工方案
- 虎年寒假实践活动方案策划
- 电梯施工安全技术交底
- 安全围栏检修方案
- 我的家乡课件中班
- 2024永磁外转子 EC 风机系统技术条件
- 2024年下载客运从业资格证模拟考试题库
- 高职高考英语词汇表
- 2024年华东电力设计院限公司校园招聘高频考题难、易错点模拟试题(共500题)附带答案详解
- 常住人口登记表(集体户口)-英文翻译
- 药品经营质量管理规范培训课件
- 《宠物护理与美容技术》课件-染色
- 法律检索教学课程设计
评论
0/150
提交评论