多线程-java网络程序设计

上传人:第*** 文档编号:53552801 上传时间:2018-09-02 格式:PPT 页数:34 大小:298KB
返回 下载 相关 举报
多线程-java网络程序设计_第1页
第1页 / 共34页
多线程-java网络程序设计_第2页
第2页 / 共34页
多线程-java网络程序设计_第3页
第3页 / 共34页
多线程-java网络程序设计_第4页
第4页 / 共34页
多线程-java网络程序设计_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《多线程-java网络程序设计》由会员分享,可在线阅读,更多相关《多线程-java网络程序设计(34页珍藏版)》请在金锄头文库上搜索。

1、Java网络程序设计,信息工程系 孙琳2013-08,第六章 多线程,信息工程系 孙琳2013-08,6 多线程,6.1 在Java中实现多线程 6.2 线程的五种状态 6.3 线程的优先级 6.4 线程的同步 6.5 线程的阻塞 6.6 守护线程 6.7 线程组,计算机基本知识补充,一般常见的Java应用程序都是单线程的。比如,用java命令运行一个最简单的HelloWorld的Java应用程序时,就启动了一个JVM进程,JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出 。

2、对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。实际上,操作的系统的多进程实现了多任务并发执行,程序的多线程实现了进程的并发执行。多任务、多进程、多线程的前提都是要求操作系统提供多任务、多进程、多线程的支持。,在Java程序中,JVM负责线程的调度。线程调度是值按照特定的机制为多个线程分配CPU的使用权。 调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用

3、CPU的时间;抢占式调度是根据线程的优先级别来获取CPU的使用权。JVM的线程调度模式采用了抢占式模式。,计算机基本知识补充,所谓的“并发执行”、“同时”其实都不是真正意义上的“同时”。众所周知,CPU都有个时钟频率,表示每秒中能执行cpu指令的次数。在每个时钟周期内,CPU实际上只能去执行一条(也有可能多条)指令。操作系统将进程线程进行管理,轮流(没有固定的顺序)分配每个进程很短的一段是时间(不一定是均分),然后在每个线程内部,程序代码自己处理该进程内部线程的时间分配,多个线程之间相互的切换去执行,这个切换时间也是非常短的。因此多任务、多进程、多线程都是操作系统给人的一种宏观感受,从微观角度

4、看,程序的运行是异步执行的。 用一句话做总结:虽然操作系统是多线程的,但CPU每一时刻只能做一件事,和人的大脑是一样的。,计算机基本知识补充,什么是进程,进程就是一个在内存中独立运行的程序,有自己的地址空间 。任务管理器里可以看到有多个进程 “多任务”:指操作系统能同时运行多个进程(程序)。如xp系统可以同时运行写字板程序、画图程序、WORD、EXCEL等,多线程:在同一程序中,有多个顺序流同时执行。,图1 JVM轮流执行线程,Java中的线程,Thread 是process之中正在运行着的一段代码,通常是一个功能块。程序运行时可以派生出多个线程同时运行。每个线程(执行线索)也有它产生存在和消

5、亡的过程。同类的多个线程共享一块内存空间和一组系统资源。另外,线程可以利用这些共享单元实现数据交换、通信和同步。,线程与进程的比较,都是程序的多个顺序的流动态执行。 线程是一种轻量级的进程,同类的多个线程是共享一块内存空间和一组系统资源 ,线程切换的开销小。 每个进程都有独立的代码和数据空间,进程切换的开销大。一个进程中可以包含多个线程 。,返回,6.1 在Java中实现多线程,Java的线程是通过java.lang.Thread类来实现的。 每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体(即线程的可执行代码)。,用Thread类创建

6、线程,要将一段代码在一个新的线程上运行,该代码应该在一个类的run函数中,并且函数所在的类是Thread类的子类,子类要覆盖Thread类中的run函数,在子类的run函数中调用想在新线程上运行的程序代码。 启动一个新的线程,我们不是直接调用Thread的子类对象的run函数,而是调用Thread子类对象的start(从Thread类继承到的)方法,Thread类对象的start方法将产生一个新的线程,并在该线程上运行该Thread类对象中的run方法。 由于线程的代码段在run方法中,那么该方法执行完成后线程也就相应的结束了。因而我们可以通过控制run方法中循环的条件来控制线程的结束。,多线

7、程,文件,输入输出装置,各种系统资源,数据区段,程序区段,只有一个地方在执行,文件,输入输出装置,各种系统资源,程序区段,同时有数个地方在执行,传统的进程,多线程的任务,创建线程,有两种方法用来创建线程: 继承Thread父类,并覆盖 run() 方法。 class mythread extends Thread public void run( ) /* 覆盖该方法*/ 声明一个实现 Runnable 接口的类,并实现 run() 方法。 class mythread implements Runnablepublic void run( ) /* 实现该方法*/ 用start()方法启动线

8、程: Thread t1 = new Thread(); T1.start();,class MitiSay extends Thread public MitiSay (String threadName)super(threadName);public void run()System.out.println(getName()+“线程运行开始“);System.out.println(getName()+“线程的优先级“+getPriority();for(int i=0;i10;i+)System.out.println(i+“ “+getName();/*trysleep(int)M

9、ath.random()*10);catch(InterruptedException e)e.printStackTrace();*/System.out.println(getName()+“线程运行结束“); ,public class TestMitiThread public static void main(String args) System.out.println(Thread.currentThread().getName()+“线程运行开始“);new MitiSay(“A“).start();new MitiSay(“B“).start();new MitiSay(“C

10、“).start();System.out.println(Thread.currentThread().getName()+“线程运行结束“); ,public class MyThread implements Runnableint count=1,number;public MyThread(int num)number=num;System.out.println(“创建线程“+number);public void run()while(true)System.out.println(“线程“+number+“:计数“+count);if(+count=6) return;publ

11、ic static void main(String args) for(int i=0;i5;i+)new Thread(new MyThread(i+1).start(); ,6.2 线程的五种状态,创建状态new 当用new创建一个线程时,该线程尚未运行,start()尚未被调用 可运行状态runnable 一旦调用了start方法,该线程便是一个可运行的线程。CPU 时间随时可能被分配给该线程,从而使得它执行。 运行状态running 运行run()方法代码 阻塞状态block 死亡状态dead:由于下面两个原因,线程将变成死线程: 由于run方法的正常退出而自然死亡; 没有捕获到的异

12、常事件终止了run方法的执行,从而导致线程突然死;,线程的状态,blocked(被中断运行)阻塞状态:线程不会被分配 CPU 时间,无法执行;可能阻塞于I/O,或者阻塞于同步锁。 blocked(被中断运行):当出现下列操作之一时,线程便进入中断状态: 有人调用该线程的sleep()方法; 该线程调用了wait()方法; 该线程调用了一个在输入输出时中断的操作,也就是说,在输入和输出操作完成之前,该操作不会返回到它的调用程序; 该线程试图锁定一个当前被另一个线程锁定了的对象,线程状态迁移图,新建 (new),可运行 (runnable),被中断 (blocked),死亡 (dead),Run方

13、法退出,异常停止,start(),睡眠sleep(),在I/O上中断,I/O操作完成,wait(),notify(),等待锁定,锁可用,new thread(),睡眠结束,6.3 线程的优先级,线程的优先级代表该线程的重要程度,当有多个线程同时处于可执行状态并等待获得 CPU 时间时,线程调度系统根据各个线程的优先级来决定给谁分配 CPU 时间,优先级高的线程有更大的机会获得 CPU 时间,优先级低的线程也不是没有机会,只是机会要小一些罢了。 线程的优先级仍然无法保障线程的执行次序。只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行。,在java中,每一个线程都有一个优先

14、级。默认情况下,一个线程将继承其父线程的优先级。线程的优先级用数字来表示,范围从1到10,一个线程的缺省优先级是5 Thread.MIN_PRIORITY = 1Thread.MAX_PRIORITY = 10Thread.NORM_PRIORITY = 5 调用 Thread 类的方法 getPriority()和 setPriority()来存取线程的优先级。 setPriority()带有一个010之间的整数,如果大于10或者小于10,抛出IllegalArgumentException。int getPriority();void setPriority(int newPriority

15、);,t1.setPriority(10); t2.setPriority(1);,不要误以为优先级越高就先执行。谁先执行还是取决于谁先取得CPU的资源,线程的问题,由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来访问冲突这个严重的问题。 例如:当一个 Java 线程在修改一个共享变量时,另外一个线程正在使用或者更新同一个变量,这样容易导致程序出现错误的结果。,解决办法,如果想解决这种问题,就需要使用同步。所谓同步就是在统一时间段中只有有一个线程运行, 其他的线程必须等到这个线程结束之后才能继续执行。,关键代码段,为解决操作的不完整性问题,在Java 语言中,引入了对象互斥锁

16、的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为“ 互斥锁“ 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。 关键字synchronized 来与对象的互斥锁联系。当某个对象用synchronized 修饰时,表明该对象在任一时刻只能由一个线程访问。 Synchronized(obj) 关键段 obj 锁对象,6.4 线程的同步,synchronized方法 public synchronized 方法返回类型 方法名(参数列表)/ 其他代码 synchronized块 synchronized(同步对象)/需要同步的代码 一般都把当前对象this作为同步对象。,

17、java.lang.Thread类,这个类包含了创建和运行线程所需的一切东西 构造函数: public Thread(); public Thread(Runnable target); public Thread(ThreadGroup group, Runnable target); public Thread(String name); public Thread(ThreadGroup group, String name); public Thread(Runnable target, String name); public Thread(ThreadGroup group, Runnable target, String name); 参数说明: target:一个对象,线程启动后它的run方法会被调用。如果该参数为null,那么thread对象本身的run方法会被调用 group:线程组对象 name:新线程对象的名字,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号