欢迎来到天天文库
浏览记录
ID:57042409
大小:92.50 KB
页数:19页
时间:2020-07-28
《2019年Java实用教程第14讲Java多线程(一)课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第14讲Java多线程(一)14.1Java中的线程14.2Java多线程的实现14.3线程池14.4线程的调度14.5前台线程和后台线程14.6本章小结(1)多进程创建一个进程要占用相当一部分处理器时间和内存资源,而且多数操作系统中进程享有独立的内存空间,不允许进程间相互内存。所以,进程间的通信很不方便。(2)多线程线程也称为轻型进程,因其活动在单个进程内,所以创建线程要比创建进程要廉价得多,并且允许线程间协作和数据交换,所以线程比进程更可取。但并不是所有的操作系统都提供对线程的支持。14.1Java中的线程线程是有生命周期的,一个线程的生命周期包含以下五种状态(1)新建状
2、态(New)(2)就绪状态(Runnable)(3)运行状态(Running)(4)阻塞状态(Blocked)(5)死亡状态(Dead)导致线程阻塞的原因有以下几种:(1)通过调用sleep(milliseconds)使线程进入休眠状态,在这种情况下,线程在指定的时间内不会运行。(2)通过调用wait()使线程挂起,直到线程得到了notify()或notifyAll()消息后,线程才会进入就绪状态。(3)线程在等待某个输入/输出完成。(4)线程试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另一个线程已经获取了这个锁。14.2Java多线程的实现(1)扩展Threa
3、d类Thread类是一个具体的类,该类封装了线程的行为。要创建一个线程,可以使用Thread类的子类,但子类必须覆盖Thread中的run()函数。把有用的工作放在run()函数中完成。要想启动这个线程,必须使用子类对象调用start()函数。(2)实现Runnable接口此接口中只有一个函数,run(),此函数必须由实现了此接口的类实现。但是,就启动这个线程而言,其语义与前一个示例稍有不同。我们可以用Runnable接14.3线程池JavaSE5对线程类库做了大量的扩展,其中线程池就是其新特征之一。开辟一块内存空间(线程池),里面存放了众多(未死亡)的线程,池中线程执行调度
4、由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省系统的资源。Java5的线程池分为固定尺寸的线程池、可变尺寸连接池和单任务线程池等。14.3.1固定尺寸线程池可以采用Executors类中的静态方法newFixedThreadPool(intnThreads)方法创建一个固定尺寸大小的线程池。ExecutorServiceexec=Executors.newFixedThreadPool(2);14.3.2可变尺寸线程池可以使用Executors.newCachedThreadPool()根据需要创建一
5、个线程池。importjava.util.concurrent.*;publicclassCachedThreadPoolDemo{publicstaticvoidmain(String[]args){ExecutorServiceexec=Executors.newCachedThreadPool();for(inti=0;i<10;i++)exec.execute(newMyRunnable(i));exec.shutdown();}}14.3.3单任务线程池可以使用Executors.newSingleThreadExecutor()创建一个单任务线程池。importj
6、ava.util.concurrent.*;publicclassSingleThreadPoolDemo{publicstaticvoidmain(String[]args){ExecutorServiceexec=Executors.newSingleThreadExecutor();for(inti=0;i<10;i++)exec.execute(newMyRunnable(i));exec.shutdown();}}14.4线程的调度Java虚拟机采用抢占式调度模型,尽量优先让就绪队列中优先级高的线程占用CPU,如果可运行池中的线程优先级相同,那么就随机选择一个线程,
7、使其占用CPU。处于运行状态的线程会一直运行,直至它不得不放弃CPU。一个线程放弃CPU的原因有以下几个方面:(1)Java虚拟机让当前线程暂时放弃CPU,转到就绪状态,使其它线程获得运行机会;(2)当前线程因为某些原因而进入阻塞状态;(3)线程结束运行。线程的调度不是跨平台的,它不仅仅取决于Java虚拟机,还依赖于操作系统。Java的线程调度是不分时的,同时启动多个线程后,不能保证各个线程轮流获得均等的CPU时间片。Java线程调度是Java多线程的核心,调度只能最大限度的影响线程执行的次序,而不能做
此文档下载收益归作者所有