书签 分享 收藏 举报 版权申诉 / 45
上传文档赚钱

类型Java语言程序设计第8章课件.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:4145216
  • 上传时间:2022-11-14
  • 格式:PPT
  • 页数:45
  • 大小:169.42KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《Java语言程序设计第8章课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    Java 语言程序设计 课件
    资源描述:

    1、第第8章章 线程线程郑郑 莉莉JAVA语言程序设计1本讲内容本讲内容l线程基础线程基础 线程的概念 Thread类 Runnable接口 资源共享和线程同步 线程间的通信l线程的生命周期线程的生命周期l线程的优先级线程的优先级l程序举例程序举例2线程的概念线程的概念l进程:程序的一次执行进程:程序的一次执行l线程:一个进程中的多个控制流线程:一个进程中的多个控制流l通过多线程,一个进程表面上看同时可以通过多线程,一个进程表面上看同时可以执行一个以上的任务执行一个以上的任务并发并发l多数程序设计语言不支持并发,支持多线多数程序设计语言不支持并发,支持多线程要借助于操作系统程要借助于操作系统“原语

    2、(原语(primitives)”lJava是第一个支持内置线程操作的主流编是第一个支持内置线程操作的主流编程语言程语言线 程 基 础3Thread类简介类简介l线程类需要继承线程类需要继承Thread类类lThread 的构造函数的构造函数public Thread(String threadName)public Thread()l在线程的在线程的run方法中编写线程的主要任务方法中编写线程的主要任务lsleep 方法使线程休眠方法使线程休眠linterrupt 方法中断一个运行中的线程方法中断一个运行中的线程 lisAlive方法检查线程的状态方法检查线程的状态lsetName方法设置线程

    3、名方法设置线程名ljoin方法等待线程结束,以执行当前线程方法等待线程结束,以执行当前线程线 程 基 础4例例8_1 在新线程中计算整数的阶乘在新线程中计算整数的阶乘public class Ex8_1 public static void main(String args)System.out.println(main thread starts);FactorialThread thread=new FactorialThread(10);thread.start();System.out.println(new thread started,main thread ends );/end

    4、 main 线 程 基 础5/class FactorialThread controls thread executionclass FactorialThread extends Thread private int num;public FactorialThread(int num)this.num=num;public void run()int i=num;int result=1;while(i0)result=result*i;i=i-1;System.out.println(The factorial of+num+is+result);System.out.println(

    5、new thread ends);6运行结果如下:运行结果如下:main thread startsnew thread started,main thread endsThe factorial of 10 is 3628800new thread ends7例例8_2 创建创建3个新线程,每个线程个新线程,每个线程睡眠任意睡眠任意0-6秒钟,然后结束。秒钟,然后结束。public class Ex8_2 public static void main(String args)/创建并命名每个线程创建并命名每个线程 TestThread thread1=new TestThread(thre

    6、ad1);TestThread thread2=new TestThread(thread2);TestThread thread3=new TestThread(thread3);System.out.println(Starting threads);thread1.start();/启动线程启动线程1 thread2.start();/启动线程启动线程2 thread3.start();/启动线程启动线程3 System.out.println(Threads started,main endsn);线 程 基 础8class TestThread extends Thread priv

    7、ate int sleepTime;public TestThread(String name)/构造函数构造函数 super(name);/调用基类构造函数为线程命名调用基类构造函数为线程命名 /获得随机休息毫秒数获得随机休息毫秒数 sleepTime=(int)(Math.random()*6000);public void run()/线程启动并开始运行后要执行的方法线程启动并开始运行后要执行的方法 try System.out.println(getName()+going to sleep for +sleepTime);Thread.sleep(sleepTime);/线程休眠线程

    8、休眠 catch(InterruptedException exception);/运行结束,给出提示信息运行结束,给出提示信息 System.out.println(getName()+finished);9运行结果为:运行结果为:Starting threadsThreads started,main endsthread1 going to sleep for 3519thread2 going to sleep for 1689thread3 going to sleep for 5565thread2 finishedthread1 finishedthread3 finished1

    9、0Runnable接口接口l如果希望一个已经有基类的类支持多如果希望一个已经有基类的类支持多线程,则不能再继承线程,则不能再继承Thread类了类了(Java不支持多继承)不支持多继承)解决方法:使类实现Runnable接口,再与Thread类结合 使用一个内部类提供Runnable的实现代码,将内部类的对象与Thread结合l相对于相对于Thread类,它更适合于多个线类,它更适合于多个线程处理同一资源程处理同一资源线 程 基 础11例例8_3 使用使用Runnable接口接口实现例实现例8_1功能功能public class Ex8_1 public static void main(St

    10、ring args)System.out.println(main thread starts);FactorialThread t=new FactorialThread(10);new Thread(t).start();System.out.println(new thread started,main thread ends );/end main 线 程 基 础12/class FactorialThread controls thread executionclass FactorialThread implements Runnable private int num;publi

    11、c FactorialThread(int num)this.num=num;public void run()int i=num;int result=1;while(i0)result=result*i;i=i-1;System.out.println(The factorial of+num+is+result);System.out.println(new thread ends);13例例8_4 使用使用Runnable接口实现接口实现例例8_2功能功能public class Ex8_4 public static void main(String args)/创建创建3个实现个实

    12、现Runnable接口类的对象接口类的对象 TestThread thread1=new TestThread();TestThread thread2=new TestThread();TestThread thread3=new TestThread();System.out.println(Starting threads);/分别以三个对象为参数创建三个新线程,分别以三个对象为参数创建三个新线程,/第二个参数为新线程命名并启动之第二个参数为新线程命名并启动之 new Thread(thread1,Thread1).start();new Thread(thread2,Thread2).

    13、start();new Thread(thread3,Thread3).start();System.out.println(Threads started,main endsn);线 程 基 础14class TestThread implements Runnable private int sleepTime;public TestThread()/构造方法构造方法 /获得随机休息毫秒数获得随机休息毫秒数 sleepTime=(int)(Math.random()*6000);public void run()/线程启动并开始运行后要执行的方法线程启动并开始运行后要执行的方法 try S

    14、ystem.out.println(Thread.currentThread().getName()+going to sleep for +sleepTime);Thread.sleep(sleepTime);/线程休眠线程休眠 catch(InterruptedException exception);/运行结束,给出提示信息运行结束,给出提示信息 System.out.println(Thread.currentThread().getName()+finished);15运行结果如下:运行结果如下:Starting threadsThread1 going to sleep for 1

    15、487Thread2 going to sleep for 1133Threads started,main endsThread3 going to sleep for 2328Thread2 finishedThread1 finishedThread3 finished16资源共享和线程同步资源共享和线程同步l独立的同时运行的线程有时需要共享一些数据并且考独立的同时运行的线程有时需要共享一些数据并且考虑到彼此的状态和动作。虑到彼此的状态和动作。例如生产/消费问题:生产线程产生数据流,然后这些数据流再被消费线程消费。具体来说,假设一个Java应用程序,其中有一个线程负责往文件写数据,另一个

    16、线程从同一个文件中往出都数据,因为涉及到同一个资源,这里是同一个文件,这两个线程必须保证某种方式的同步。l当多个线程的执行代码来自同一个类的实例(若干个)当多个线程的执行代码来自同一个类的实例(若干个)时,即称它们共享相同的代码,当共享访问相同的对时,即称它们共享相同的代码,当共享访问相同的对象时,即它们共享相同的数据。象时,即它们共享相同的数据。使用Runnable接口可以轻松实现多个线程共享相同数据,只要用同一个实现了Runnable接口的实例作为参数创建多个线程就可以了。线 程 基 础17例例8_5 修改例修改例8_4/只用一个只用一个Runnable类型的对象为参数创建类型的对象为参数

    17、创建3个新线程。个新线程。public class Ex8_5 public static void main(String args)/只创建只创建1个实现个实现Runnable接口类的对象接口类的对象 TestThread thread=new TestThread();System.out.println(Starting threads);/只用一个只用一个Runnable类型对象为参数创建三个新线程,类型对象为参数创建三个新线程,/命名并启动之命名并启动之 new Thread(thread,Thread1).start();new Thread(thread,Thread2).st

    18、art();new Thread(thread,Thread3).start();System.out.println(Threads started,main endsn);线 程 基 础18class TestThread implements Runnable private int sleepTime;public TestThread()/构造函数构造函数 /获得随机休息毫秒数获得随机休息毫秒数 sleepTime=(int)(Math.random()*6000);public void run()/线程启动并开始运行后要执行的方法线程启动并开始运行后要执行的方法 try Syst

    19、em.out.println(Thread.currentThread().getName()+going to sleep for +sleepTime);Thread.sleep(sleepTime);/线程休眠线程休眠 catch(InterruptedException exception);/运行结束,给出提示信息运行结束,给出提示信息 System.out.println(Thread.currentThread().getName()+finished);19Starting threadsThread1 going to sleep for 966Thread2 going t

    20、o sleep for 966Threads started,main endsThread3 going to sleep for 966Thread1 finishedThread2 finishedThread3 finished20例例8_6 用三个线程模拟三个售用三个线程模拟三个售票口,总共出售票口,总共出售200张票。张票。public class Ex8_6public static void main(String args)/新建一个售票类的对象新建一个售票类的对象SellTickets t=new SellTickets();/用此对象作为参数创建用此对象作为参数创建3个新

    21、线程并启动个新线程并启动new Thread(t).start();new Thread(t).start();new Thread(t).start();线 程 基 础21class SellTickets implements Runnable/将共享的资源作为私有变量将共享的资源作为私有变量 private int tickets=200;public void run()while(tickets0)/直到没有票可售为止直到没有票可售为止 System.out.println(Thread.currentThread().getName()+is selling ticket+tick

    22、ets-);22例例8_7 用两个线程模拟存票、用两个线程模拟存票、卖票过程卖票过程public class Ex8_7public static void main(String args)/新建一个票类对象,总票数作为参数新建一个票类对象,总票数作为参数 Tickets t=new Tickets(10);/以票类对象为参数创建存票线程对象,并启动以票类对象为参数创建存票线程对象,并启动 new Producer(t).start();/以同一个票类对象为参数创建售票线程,并启动以同一个票类对象为参数创建售票线程,并启动 new Consumer(t).start();线 程 基 础23c

    23、lass Tickets /票类票类int number=0;/票号票号int size;/总票数总票数 /表示目前是否有票可售表示目前是否有票可售boolean available=false;/构造方法,传入总票数参数构造方法,传入总票数参数 public Tickets(int size)this.size=size;24class Producer extends Thread /存票线程存票线程Tickets t=null;public Producer(Tickets t)/构造函数以一个票类对象为参数构造函数以一个票类对象为参数 this.t=t;public void run(

    24、)/限制循环条件为存票序号小于总票数限制循环条件为存票序号小于总票数 while(t.number)t.size)System.out.println(Producer puts ticket+(+t.number);t.available=true;/可以卖票可以卖票 25class Consumer extends Thread /售票线程售票线程Tickets t=null;int i=0;public Consumer(Tickets t)/构造函数以一个票类对象为参构造函数以一个票类对象为参数数 this.t=t;public void run()while(it.size)/循环条

    25、件为售票序号小于总票数循环条件为售票序号小于总票数 if(t.available=true&i=t.number)/有票且小于目前票序号有票且小于目前票序号 System.out.println(Consumer buys ticket+(+i);if(i=t.number)/如果票已售到当前序号,则不可售如果票已售到当前序号,则不可售 t.available=false;26运行结果运行结果Producer puts ticket 1Producer puts ticket 2Producer puts ticket 3Producer puts ticket 4Producer puts

    26、ticket 5Producer puts ticket 6Producer puts ticket 7Producer puts ticket 8Consumer buys ticket 1Consumer buys ticket 2Consumer buys ticket 3Consumer buys ticket 4Consumer buys ticket 5Consumer buys ticket 6Consumer buys ticket 7Consumer buys ticket 8Producer puts ticket 9Producer puts ticket 10死机(进入

    27、死循环)死机(进入死循环)27错误原因错误原因假如售票线程运行到假如售票线程运行到t.available=false之前,之前,CPU切换到执行存票线程,存票切换到执行存票线程,存票线程将线程将available置为置为true,但再次切换,但再次切换到售票线程后,售票线程执行到售票线程后,售票线程执行t.available=false,则由于售票号目前,则由于售票号目前还是还是8,小于总票数,且存票线程已经,小于总票数,且存票线程已经结束不再能将结束不再能将t.available置为置为true,则,则售票线程陷入了死循环。售票线程陷入了死循环。线 程 基 础28线程同步(线程同步(Sync

    28、hronization)lJava 使用的同步机制是监视器,支持线程使用的同步机制是监视器,支持线程的互斥与同步的互斥与同步 互斥:许多线程在同一个共享数据上操作而互不干扰,同一时刻只能有一个线程访问该共享数据。因此有些方法或程序段在同一时刻只能被一个线程执行,称之为监视区。协作:多个线程可以有条件地同时操作共享数据执行监视区代码的线程在条件满足的情况下可以允许其它线程进入监视区。线 程 基 础29线程间的通信线程间的通信l线程同步关键字线程同步关键字synchronized 用于指定需要同步的代码段或方法,也就是监视区。lwait()当前状态不适合本线程执行时,进入等待状态lnotify()

    29、随机唤醒一个等待的线程,本线程继续执行。lnotifyAll()唤醒所有等待的线程,本线程继续执行。线 程 基 础30线程间的通信线程间的通信l线程被唤醒以后,还要等发出唤醒消线程被唤醒以后,还要等发出唤醒消息者释放监视器,这期间关键数据仍息者释放监视器,这期间关键数据仍可能被改变。可能被改变。l被唤醒线程的线程可能有多个。(使被唤醒线程的线程可能有多个。(使用用notifyAll时)。时)。l被唤醒的线程开始执行时,一定要判被唤醒的线程开始执行时,一定要判断当前状态是否适合自己运行。断当前状态是否适合自己运行。线 程 基 础31例例8_8 实现例实现例8_7功能。功能。l将同步方法放在共享的

    30、资源类将同步方法放在共享的资源类Tickets中。中。public class Ex8_8public static void main(String args)Tickets t=new Tickets(10);new Producer(t).start();new Consumer(t).start();线 程 基 础32class Tickets int size;/票总数票总数 int number=0;/存票序号存票序号 int i=0;/售票序号售票序号 boolean available=false;/是否有待售的票是否有待售的票 public Tickets(int size)

    31、this.size=size;public synchronized void put()/同步代码块,实现存票的功能同步代码块,实现存票的功能 System.out.println(Producer puts ticket+(+number);available=true;public synchronized void sell()/同步代码块,实现售票的功能同步代码块,实现售票的功能 if(available=true&i=number)System.out.println(Consumer buys ticket+(+i);if(i=number)available=false;33c

    32、lass Consumer extends Thread Tickets t=null;/构造方法,使两线程共享票类对象构造方法,使两线程共享票类对象public Consumer(Tickets t)this.t=t;public void run()/如果售票数小于限定总量,则不断售票如果售票数小于限定总量,则不断售票 while(t.it.size)t.sell();34例例8_9 每存入一张票,就售一每存入一张票,就售一张票,售出后,再存入张票,售出后,再存入public class Ex8_8public static void main(String args)Tickets t=

    33、new Tickets(10);new Producer(t).start();new Consumer(t).start();线 程 基 础35class Tickets int size;int number=0;int i=0;boolean available=false;public Tickets(int size)this.size=size;public synchronized void put()if(available)/如果还有存票待售,则存票线程等待如果还有存票待售,则存票线程等待 trywait();catch(Exception e)System.out.prin

    34、tln(Producer puts ticket+(+number);available=true;notify();./存票后唤醒售票线程开始售票存票后唤醒售票线程开始售票36public synchronized void sell()if(!available)/如果没有存票,则售票线程等待如果没有存票,则售票线程等待 trywait();catch(Exception e)if(i=number)System.out.println(Consumer buys ticket +(+i);if(i=number)try Thread.sleep(1);catch(Exception e)

    35、available=false;notify();/售票后唤醒存票线程开始存票售票后唤醒存票线程开始存票37class Producer extends ThreadTickets t=null;public Producer(Tickets t)this.t=t;public void run()while(t.numbert.size)t.put();38class Consumer extends ThreadTickets t=null;public Consumer(Tickets t)this.t=t;public void run()while(t.it.size)t.sell(

    36、);39运行结果如下:运行结果如下:Producer puts ticket 1Consumer buys ticket 1Producer puts ticket 2Consumer buys ticket 2Producer puts ticket 3Consumer buys ticket 3Producer puts ticket 4Consumer buys ticket 4Producer puts ticket 5Consumer buys ticket 5Producer puts ticket 6Consumer buys ticket 6Producer puts tick

    37、et 7Consumer buys ticket 7Producer puts ticket 8Consumer buys ticket 8Producer puts ticket 9Consumer buys ticket 9Producer puts ticket 10Consumer buys ticket 1040守护(守护(Daemon)线程线程l为了辅助其它线程而运行的线程为了辅助其它线程而运行的线程 不妨碍程序终止“垃圾回收”便是一个守护线程l用用setDaemon方法将线程设置为守护方法将线程设置为守护线程线程线 程 基 础41例例8_10 创建一个无限循环的守创建一个无限循环

    38、的守护线程护线程public class Ex8_10 public static void main(String args)ThreadTest t=new ThreadTest();t.setDaemon(true);t.start();class ThreadTest extends Thread public void run()while(true)42线程的状态线程的状态l诞生状态诞生状态 线程刚刚被创建l就绪状态就绪状态 线程的 start 方法已被执行 线程已准备好运行l运行状态运行状态 处理机分配给了线程,线程正在运行l阻塞状态(阻塞状态(Blocked)在线程发出输入/输

    39、出请求且必须等待其返回,或遇到用synchronized标记的方法而未获得其监视器暂时不能进入执行时l休眠状态(休眠状态(Sleeping)执行sleep方法而进入休眠l死亡状态死亡状态 线程已完成或退出线程的生命周期43新线程ReadyStartRunningyield获得CPU资源WaitingSleepingBlocked运行直到结束notifynotifyAll等待时间到interrupt休眠时间到interruptrun方法运行结束线程变为dead状态I/O操作进入synchronized语句未获得监视器Interrupt获得监视器I/O操作结束44线程优先级与调度线程优先级与调度lJava 线程优先级(线程优先级(priority)取值范围 1-10l时间片(时间片(Timeslicing)每个线程被赋予一定的处理机时间 总是调度最高优先级的线程运行45

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:Java语言程序设计第8章课件.ppt
    链接地址:https://www.163wenku.com/p-4145216.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库