十五章及多线程_第1页
十五章及多线程_第2页
十五章及多线程_第3页
十五章及多线程_第4页
十五章及多线程_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

第十五章线程及多线程

本讲内容线程的定义多线程举例线程的创建与启动两种实现多线程方法的比较本讲目标线程的创建与启动两种实现多线程方法的比较线程的定义什么是程序?程序是一段静态的代码,它是应用程序执行的蓝本。什么是进程?进程是指一种正在运行的程序,有自己的地址空间。作为蓝本的程序可以被多次加载到系统的不同内存区域分别执行,形成不同的进程。基于进程的特点是允许计算机同时运行两个或更多的程序。什么是线程?线程是进程内部单一的一个顺序控制流。一个进程在执行过程中,可以产生多个线程。每个线程也有自己产生、存在和消亡的过程。进程是系统资源分配的单位,可包括多个线程。线程是独立调度和分派的基本单位,共享进程资源。引入进程是为了多个程序并发执行,提高资源的利用率和系统吞吐量引入线程,是为了减少程序在并发执行时所付出的时空开销多线程多线程编程的含义是将程序任务分成几个并行的子任务,常用于网络编程中。多线程是与单线程比较而言的普通的Windows采用多线程程序结构,其工作原理是:主程序有一个消息循环,不断从消息队列中读入消息来决定下一步所要干的事情,一般是针对一个函数,只有等这个函数执行完之后,主程序才能接收另外的消息来执行。在执行这个子函数过程中你什么也不能干,但往往读网络数据和等待用户输入有很多时间处于等待状态,多线程利用这个特点将任务分成多个并发任务后,就可以解决这个问题多线程的好处多线程的优点多线程使系统的空转时间最少,提高CPU利用率共享资源,不浪费内存。线程间的信息传递容易。线程控制灵活,可在程序中自由调度。如何实现多线程?Java中实现多线程的类有两种方法:扩展java.lang.Thread类,覆盖Thread类的run方法。生成实现java.lang.Runnable接口的类并将其它的实例与java.lang.Thread实例相关联。Thread类是负责向其它类提供线程支持的最主要的类,要使用一个类具有线程功能,在Java中只要简单地从Thread类派生一个子类就可以了。多线程举例—Thread类classThreadDemo1{ public

static

voidmain(Stringargs[]){

MyThreadt=newMyThread(); t.start(); while(true){ System.out.println("mainthreadisrunning"); } }}classMyThreadextendsThread{ public

void

run(){

while(true){ System.out.println(Thread.currentThread().getName()+"isrunning"); } }}多线程举例—Runnable接口classThreadDemo1{ public

static

voidmain(Stringargs[]){

MyThreadmt=newMyThread(); Threadt=newThread(mt); t.start();

while(true){ System.out.println("mainthreadisrunning"); } }}classMyThreadimplementsRunnable{

public

void

run(){

while(true){ System.out.println(Thread.currentThread().getName()+"isrunning"); } }}线程的创建与启动两种方法来创建线程:继承Java.lang.Thread类,并覆盖run()方法。classMyThreadextendsThread{publicvoidrun(){/*覆盖该方法*/}}实现Java.lang.Runnable接口,并实现run()方法。 classMyThreadimplementsRunnable{publicvoidrun(){/*实现该方法*/}}线程的创建与启动新建的线程不会自动开始运行,必须通过start()方法启动线程。如果不调用这个方法,线程将不会运行。也就是说可以事先创建线程,并在需要的时候才启动他们。如:继承Thread的线程:MyThreadt=newMyThread();t.start();实现Runnable接口的线程:MyThreadmt=newMyThread();Threadt=newThread(mt);t.start();线程的创建与启动主线程介绍在Java程序启动时,一个线程立刻运行,该线程通常称为程序的主线程。Main就是在这个线程上运行。当不再产生新的线程时,程序是单线程的。主线程的重要性体现在两个方面:它是产生其他子线程的线程。通常它必须最后完成执行,因为它执行各种关闭动作线程的四种状态新状态:线程已被创建但尚未执行(start()尚未被调用)。可执行状态:线程可以执行,虽然不一定正在执行。CPU时间随时可能被分配给该线程,从而使得它执行。死亡状态:正常情况下run()返回使得线程死亡。调用stop()或destroy()亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。阻塞状态:线程不会被分配CPU时间,无法执行。线程的创建与启动方法用途staticThreadcurrentThread()得到当前线程finalStringgetName()返回线程的名称finalvoidsetName(Stringname)将线程的名称设置为由name指定的名称voidstart()调用run()方法启动线程,开始线程的执行voidrun()存放线程体代码Thread中常用方法线程的创建与启动示例得到当前线程,并为其改名例子publicclassMainThreadDemo{publicstaticvoidmain(Stringargs[]){

Threadt=Thread.currentThread();System.out.println(“当前线程名称是:"+t.getName());

t.setName("MyJavaThread");

System.out.println(“改名后线程名称是:"+t.getName());System.out.println("输出当前线程"+t);}}两种实现多线程方法的比较classMyThreadextendsThread{private

inttickets=100;public

voidrun(){while(true){if(tickets>0)System.out.println(Thread.currentThread().getName()+"issallingticket"+tickets--);}}}classTest{public

static

voidmain(String[]args){MyThreadmt=newMyThread();mt.start();mt.start();mt.start();mt.start();}}使用extendsThread方法一个Thread对象只能启动一个线程,无论调用几次start()方法结果:一个窗口卖了100张票,其他窗口未卖实例:实现四个窗口共卖100张票效果两种实现多线程方法的比较classMyThreadextendsThread{private

inttickets=10;public

voidrun(){while(true){if(tickets>0)System.out.println(Thread.currentThread().getName()+"issallingticket"+tickets--);}}}classTest{public

static

voidmain(String[]args){newMyThread().start();newMyThread().start();newMyThread().start();newMyThread().start();}}使用extendsThread方法结果:四个窗口各卖了100张票实例:实现四个窗口共卖100张票效果两种实现多线程方法的比较classMyThreadimplementsRunnable{private

inttickets=100;public

voidrun(){while(true){if(tickets>0)System.out.println(Thread.currentThread().getName()+"issallingticket"+tickets--);}}}classTest{public

static

voidmain(String[]args){MyThreadmt=newMyThread();newThread(mt).start();newThread(mt).start();newThread(mt).start();newThread(mt).start();}}使用implementsRunable方法结果:四个窗口共卖了100张票实例:实现四个窗口共卖100张票效果两种实现多线程方法的比较使用Runnable接口创建多线程的优点:同一个Runnable对象可以传递给多个线程,可以实现资源共享,所以适合多个相同程序代码的线程去处理同一资源的情况可以避免由于Java的单继承带来的局限有利于程序的健壮性,代码能被多个线程共享,代码与数据是独立的线程的优先级线程在优先级代表该线程的重要程度线程的优先指当有多个线程同时处于可执行状态并等待获得CPU时间时,线程调度系统根据各个线程的优先级来决定给谁分配CPU时间,优先级高的线程有更大的机会获得CPU时间,优先级低的线程也不是没有机会,只是机会要小一些罢了。

可调用Thread类的方法getPriority()和setPriority()来获取或设置线程的优先级线程的优先级界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之间,缺省是(NORM_PRIORITY)。客户存取款多线程实例产生数据不一致的原因多个线程并发访问了同一个对象,如果破坏了不可分割的操作,从而就会造成数据不一致被多线程并发访问时如果一个对象有可能出现数据不一致的问题,那么这个对象称为线程不安全的对象线程同步如何解决多线程并发访问的问题

synchronized(object){

代码块

}线程同步线程同步线程同步线程的管理线程包括new()开始、running()运行、wait()等候和done()结束执行四种状态。第一次创建线程时,都位于new状态,在这个状态下,不能运行线程,只能等待。这时,线程要么调用start方法开始运行,要么送往done状态结束。位于done中的线程已经结束执行,这是线程的最后一个状态。一旦线程位于这个状态,就不能再次出现,而且当Java虚拟机中的所有线程都位于done状态时,程序就强行中止。线程的管理当前正在执行的所有线程都位于running状态,在程序之间用某种方法把处理器的执行时间分成时间片。位于running状态的每个线程都是能运行的,但在一个给定的时间内,每个系统处理器只能运行一个线程。与位于running

温馨提示

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

最新文档

评论

0/150

提交评论