您好,欢迎访问三七文档
java多线程程序设计程序、进程和线程程序:一段静态的代码,是应用软件执行的蓝本。进程:一个独立程序的每一次运行称为一个进程,是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程。作为执行蓝本的同一段程序可以被多次加载到系统的不同内存区域分别执行,形成不同的进程。例如:用word编辑文稿时,同时在另一个窗口下载音乐,这两个独立的程序在同时运行,称为两个进程。一个应用程序的执行(如java程序)也对应于一个进程。操作系统周期性的讲CPU切换到不同的任务,分时间片轮流运行每一个进程,而每一个进程都像是连续运行的。每一个进程占有自己的内存空间。线程线程:比进程更小的执行单位,一个进程在其执行过程中可以产生多个线程,形成多条执行线索,每条线索即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的过程。日常生活中的程序、进程和线程:程序:每学期的课程表进程:每学期的教学活动线程:每门课的教学过程单线程/多线程早期在计算机上开发的程序大多是单线程的,就是一个程序只有一条从头到尾的执行线索。多线程是一个进程中多段代码同时并发执行,是指程序中包含多条执行路径。在一个程序中同时运行多个不同的线程来执行不同的任务,即允许单个程序创建多个并行执行的任务来完成各自的任务。采用多线程,一个进程的若干任务就可以细分为多个部分由多线程来处理,这样可以增强整个程序的吞吐量,加快反应时间。例如:浏览器程序就是一个多线程的例子,当下载一个应用程序或图片时,可以同时进行其他任务,例如播放动画或声音的应用程序、打印某些内容、进行排序或者其他工作。聊天室(多人同时聊天)在现实生活中,很多的过程都具有多条线索同时动作的特性,例如,我们可以一边走路,一边接电话,两件事并行。如果不允许这样做,我们会感觉很难受。单线程程序多线程程序一个线程两个线程多线程多任务、多进程、多线程多线程和多任务是两个既有联系又有区别的概念:多任务是针对操作系统而言的,代表着操作系统可以同时运行多个应用程序(多进程),例如我们可以利用计算机边听音乐,边浏览网页,或者从网络上下载东西,等等。多线程是针对一个程序而言的,代表着一个程序内部可以同时执行线程的个数,而每个线程可以完成不同的任务。多任务、多进程、多线程要认识多线程就要从操作系统的原理说起。以前古老的DOS操作系统(V6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename文件名。为了提高系统的利用效率,采用批处理来批量执行任务。现在的操作系统都是多任务操作系统,每个运行的任务就是操作系统所做的一件事情,比如你在听歌的同时还在用MSN和好友聊天。听歌和聊天就是两个任务,这个两个任务是“同时”进行的。一个任务一般对应一个进程,也可能包含好几个进程。比如运行的MSN就对应一个MSN的进程,如果你用的是windows系统,你就可以在任务管理器中看到操作系统正在运行的进程信息。多任务、多进程、多线程一般来说,当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程。启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的。在进程中,有些程序流程块是可以乱序执行的,并且这个代码块可以同时被多次执行。实际上,这样的代码块就是线程体。线程是进程中乱序执行的代码流程。当多个线程同时运行的时候,这样的执行模式成为并发执行。多线程的目的是为了最大限度的利用CPU资源。多任务、多进程、多线程对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。实际上,操作的系统的多进程实现了多任务并发执行,程序的多线程实现了进程的并发执行。多任务、多进程、多线程的前提都是要求操作系统提供多任务、多进程、多线程的支持。Java对多线程的支持很多程序语言都是利用外部的线程软件包来实现多线程。如C语言。Java是第一个支持内置线程操作的主流编程语言。Java语言的一大特性就是内置对多线程的支持。多线程指同时存在几个执行体,按几条不同的执行线索共同工作的情况,它使得编程人员可以很方便地开发出具有多线程功能、能同时处理多个任务的功能强大的应用程序。虽然执行线程给人一种几个事件同时发生的感觉,但这只是一种错觉,因为我的计算机在任何给定的时刻只能执行那些线程中的一个,为了建立这些线程正在同步执行的感觉,java快速地把控制从一个线程切换到另外一个线程多个线程的执行是并发的,也是一种逻辑上的“同时”,而不是物理上的“同时”。如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,我们也没必要去关系它,只需要设想各个线程是同时执行的即可。如果系统有多个CPU,可以实现真正的“同时”执行。在应用程序中使用多线程不会增加CPU的数据处理能力。Java主线程一般常见的Java应用程序都是单线程的。比如,用java命令运行一个最简单的HelloWorld的Java应用程序时,就启动了一个JVM进程,JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出。当JVM加载代码,发现main方法之后,就会启动一个线程,这个线程称作“主线程”,该线程负责执行main方法。如果main中没有创建其他线程,那么当main方法执行完最后一条语句,JVM就会结束我们的java应用程序。如果main中又创建了其他线程,那么JVM就要在主线程和其他线程之间轮流切换,保证每个线程都有机会使用CPU资源,main方法即使执行完最后的语句,JVM也不会结束我们的程序,JVM一直等到程序中所有的线程都结束之后,才结束我们的java应用程序Java主线程多线程的优点使用多线程进行程序设计具有如下优点:1)多线程编程简单,效率高(能直接共享数据和资源,多进程不能)2)适合于开发服务程序(如Web服务,聊天服务等)3)适合于开发有多种交互接口的程序(如聊天程序的客户端,网络下载工具)4)减轻编写交互频繁、涉及面多的程序的困难(如监听网络端口)5)程序的吞吐量会得到改善(同时监听多种设备,如网络端口、串口、并口以及其他外设)6)有多个处理器的系统,可以并发运行不同的线程(否则,任何时刻只有一个线程在运行)Java中创建线程的方法Java虚拟机允许应用程序并发地运行多个执行线程。Java语言提供了多线程编程的扩展点,并给出了功能强大的线程控制API。Java的线程是通过java的软件包java.lang中定义的Thread来实现的。Java中有两种方法创建线程:实现Runnable接口。继承Thread类。无论使用哪种方法,都需要用到Java基础类库中的Thread类及其方法。在Java语言中,线程也是一种对象,但并非任何对象都可以成为线程,只有实现Runnable接口或继承了Thread类的对象才能成为线程。Thread类Thread类的构造方法:(1)publicThread():创建一个系统线程类的对象。(2)publicThread(Stringname):在第一个构造方法的基础上,为所创建的线程对象指定一个字符串名称供以后使用。(3)publicThread(Runnabletarget):target是实现了Runnable接口的类的target对象。Thread类Thread类的构造方法:(4)publicThread(Runnabletarget,Stringname):实现前两个构造方法的功能。(5)publicThread(ThreadGroupgroup,Runnabletarget):生成一个指定线程组和目标对象的线程。(6)publicThread(ThreadGroupgroup,Stringname):生成一个指定线程组和名字的线程。利用构造方法创建新线程对象之后,这个对象中的有关数据被初始化,从而进入线程的生命周期的第一个状态—新建状态。Thread类的主要方法方法功能CurrentThread()返回当前运行的Thread对象start()启动线程run()由调度程序调用,当run()方法返回时,该线程停止stop()使调用它的线程立即停止执行sleep(longn)使线程睡眠n毫秒,n毫秒后,线程可以再次运行suspend()使线程挂起,暂停运行NotRunnableresume()恢复挂起的线程,使处于可运行状态Runnableyield()将CPU控制权主动移交到下一个可运行线程★Thread类的主要方法(续)setName(String)赋予线程一个名字getName()取得由setName()方法设置的线程名字的字符串getPriority()返回线程优先级setPriority(int)设置线程优先级join()当前线程等待调用该方法的线程结束后,再往下执行setDaemon(boolean)设置该线程是daemon线程还是用户线程,Daemon线程也称服务线程,通常编成无限循环,在后台持续运行。Thread类的主要方法(续)在上述方法中,start()方法与run()方法最为常用,start()方法用于启动线程,run()方法为线程的主体方法,可以根据需要重写run()方法。Thread类的主要方法(续)publicstaticvoidsleep(longmillis)throwsInterruptedException在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。参数:millis-以毫秒为单位的休眠时间。抛出:InterruptedException-如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态被清除。Thread类的主要方法(续)publicvoidstart()使该线程开始执行;Java虚拟机调用该线程的run方法。结果是两个线程并发地运行;当前线程(从调用返回给start方法)和另一个线程(执行其run方法)。多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。抛出:IllegalThreadStateException-如果线程已经启动。Thread类的主要方法(续)线程的执行是一种抢占方式,优先级高的比优先级低的要获得更多的执行时间,如果想让一个线程比其他线程有更多的时间运行,可以通过设置线程的优先级解决。如一个线程创建后,可以通过在险种中调用setPriority()方法来设置其优先级,具体方法如下:publicfinalvoidsetPriority(intnewPriority)newPriority是一个1-10之间的正整数,数值越大,优先级越高,系统有一些常数值:1.MAX_PRIORITY:最高优先级(值为10)2.MIN_PRIORITY:最低优先级(值为1)3.NORM_PRIORITY:默认优先级(值为5)线程创建时,继承了父线程的优先级。父线程是指执行创建新线程对象语句的线程,它可能是主线程,也可能是用户自己定义的线程。一般情况下,主线程具有默认优先级。在线程创建之后,可以通过getPriority()方法得到线程的优先级,也可以通过setPriority()方法改变线程的优先级。Thread类的主要方法(续)每个线程在创建时可以为其指定名称,如果未指定,则由系统进行指定。对于主线程名称是:main。对于其他线程,默认名称样式是:“Thread-数字”。可以使用Thread类的getNa
本文标题:教学课件-多线程
链接地址:https://www.777doc.com/doc-2419544 .html