大三下第3章1线程_第1页
大三下第3章1线程_第2页
大三下第3章1线程_第3页
大三下第3章1线程_第4页
大三下第3章1线程_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、1第3章 线程和网络编程主要内容: 3.1 线程的概念 3.2 线程同步 3.3 网络编程基础 3.4 基于TCP/UDP的编程 21 线程简介程序:是计算机指令的集合,它以文件的形式存储在磁盘上.是个静态文件.进程:是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源。是资源申请、调度和独立运行的单位。而程序则不能。线程:是进程中的一个单一的连续控制流程。一个进程可以拥有多个线程。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享进程的存储空间,这使线程间的通信远较进程简单。6.1 线程

2、的概念3 2 线程的概念模型多个线程的执行是并发的,也就是在逻辑上”同时”,而非物理上的同时.因为系统只有一个CPU.Java的多线程是通过继承java.lang.Thread类来实现的。当无法继承Thread类的时候,系统通过Runnable接口提供另一种实现多现成的方法.当我们生成一个Thread类的对象之后,一个新的线程就产生了。通过线程对象可以启动线程、终止线程、线程挂起等。每个线程都是通过覆盖Thread对象中的方法run()来完成其操作的,方法run()称为线程体。 6.1 线程的概念42线程的概念模型通过以下两种方法创建 Thread 对象:1.声明一个 Thread 类的子类,

3、并覆盖 run() 方法。 不能再从其它类中继承了. class mythread extends Thread public void run( ) /* 线程体 */ 2.声明一个实现 Runnable 接口的类,并实现 run() 方法。灵活,可以再从其它类继承. class mythread implements Runnable public void run( ) /* 线程体 */ 6.1 线程的概念52 线程的概念模型要触发一个新线程,使用 start() 方法,如:Mythread t = new Mythread();t.start();在调用 start() 方法时,将创

4、建一个新的控制线程,接着它将调用 run() 方法。run() 方法中的代码定义了该线程所要完成的功能。我们看一个多线程例子:该例子模仿小队报数 NewThread类是个线程类,通过带参数的构造方法得到线程的名称,该类的run()方法通过for循环模拟报数.在main()方法中实例化3个线程,分别调用start()方法,执行各自的run()方法.6.1 线程的概念62 线程的概念模型public class NewThread extends Thread public NewThread (String arg0) super(arg0); public void run() System.

5、out.println( this.getName() + 报数开始); for(int i =0;i10;i+) System.out.println( this.getName() + 报数:+I ); try sleep(int) (Math.random()*1000); catch(InterruptedException e) e.printStackTrace(); System.out.println( this.getName() + 报数结束); 6.1 线程的概念72 线程的概念模型 public static void main(String args) NewThre

6、ad firstT =new NewThread(第一小队); NewThread secondT=new NewThread(第二小队); NewThread thirdT=new NewThread(第三小队); firstT.start(); secondT.start(); thirdT.start(); 6.1 线程的概念8运行结果:第一小队报数开始第一小队报数:0第三小队报数开始第三小队报数:0第二小队报数开始第二小队报数:0第二小队报数:1第三小队报数:1第三小队报数:2第三小队报数:3第一小队报数:1第一小队报数:2第三小队报数:4第二小队报数:2第三小队报数:5第一小队报数:

7、3第三小队报数:6第二小队报数:3第二小队报数:4第一小队报数:4第三小队报数:7第二小队报数:5第三小队报数:8第二小队报数:6第二小队报数:7第二小队报数:8第一小队报数:5第二小队报数:9第三小队报数:9第二小队报数结束第一小队报数:6第一小队报数:7第三小队报数结束第一小队报数:8第一小队报数:9第一小队报数结束6.1 线程的概念9线程的状态每个线程都有产生、运行、消亡的状态转换过程。线程在它的生命周期内有四种状态,分别是: 1 创建状态(new Thread) 2 可运行状态(Runnable) 3 不可运行状态(Not Runnable) 4 死亡状态(Dead)6.1 线程的概念

8、10线程的4种状态:创建、可运行、不可运行及死亡状态。6.1 线程的概念sleep、wait、supend、I/O阻塞Sleep结束、notify、resume、I/O完成线程的状态11线程调度及线程的优先级线程调度有两种方式:抢占式和非抢占式。抢占式系统在任何给定的时间内将运行最高优先级的线程。系统中所有的线程都有自己的优先级。Java提供一个线程调度器来调度处于可运行状态的所有线程。线程调度器按照线程的优先级决定处于可执行状态线程的执行顺序。Java中线程有10个优先级由低到高分别用1到10表示。Thread类中定义了3个静态变量: Thread.MIN_PRIORITY代表最低优先级1

9、Thread.NORM_PRIORITY代表默认优先级5 Thread.MAX_PRIORITY代表最高优先级10程序中可以调用方法 setPriority() 对线程进行优先级的设置6.1 线程的概念125 线程的优先级下面是一个模仿赛跑的程序class Runner extends Thread private int step = 0; public void run() while(step 50000) step +; try Thread.sleep(1); catch(Exception e); public int getStep() return step; 6.1 线程的概

10、念135 线程的优先级 public class Race public static void main(String args) Runner runner = new Runner(), new Runner(); runner0.setPriority(Thread.MIN_PRIORITY); runner1.setPriority(Thread.MAX_PRIORITY); runner0.start(); runner1.start(); while(runner0.isAlive() & runner1.isAlive() try Thread.sleep(5000); cat

11、ch(Exception e); System.out.println(Runner 0: +runner0.getStep(); System.out.println(Runner 1: +runner1.getStep(); 6.1 线程的概念14执行结果:Runner 0: 1543Runner 1: 2545Runner 0: 2957Runner 1: 5084Runner 0: 4675Runner 1: 7635Runner 0: 6102Runner 1: 10173Runner 0: 7634Runner 1: 12718Runner 0: 9115Runner 1: 152

12、51Runner 0: 10652Runner 1: 17791Runner 0: 12192Runner 1: 20335Runner 0: 13761Runner 1: 22879Runner 0: 15318Runner 1: 25432Runner 0: 16774Runner 1: 27976Runner 0: 18366Runner 1: 30517Runner 0: 19849Runner 1: 33054Runner 0: 21432Runner 1: 35606Runner 0: 22912Runner 1: 38146Runner 0: 24557Runner 1: 406

13、92Runner 0: 26025Runner 1: 43235Runner 0: 27680Runner 1: 45771Runner 0: 29230Runner 1: 48321Runner 0: 30643Runner 1: 5000015守护线程在Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线程.这个线程具有最低的优先级,用于为系统中的其他对象和线程提供服务.典型的守护线程例子是JVM中的系统资源自动回收线程.他始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源.用户线程通过调用下面Thread类的方法setDaemon()将线程设置成守护线程:pub

14、lic final void setDaemon(booleanon)6.1 线程的概念166 守护线程首先构造一个模拟播放音乐的线程类:public class MusicThread extends Thread public void run () while(true) System.out.println(“”); try sleep(100); catch(InterruptedException e) e.printStackTrace(); 6.1 线程的概念176 守护线程再构造一个模拟安装程序的线程类:public class InstallThread extends T

15、hread public void run () System.out.println(“”); for( int i=0;i=100;i=i+10) System.out.println(“”); try sleep(100); catch(InterruptedException e) e.printStackTrace(); System.out.println(“”); 6.1 线程的概念186 守护线程 public static void main(String args) MusicThread music =new MusicThread(); music.setDaemon(

16、true); music.start(); InstallThread install =new InstallThread(); install.start(); 运行结果:6.1 线程的概念196 守护线程6.1 线程的概念20主线程Java程序启动运行时JVM会自动创建一个线程,这个线程就是主线程。主线程的重要性和特殊性表现在下面两个方面:(1) 它是产生其他线程的线程。(2) 它通常执行各种关闭操作,是最后结束的线程。尽管主线程有些特殊,无需手动创建,但它还是一个线程类的对象。可以通过下面Thread类的方法currentThread()获得主线程的引用,从而达到操作主线程的目的。pu

17、blic static Thread currentThread()6.1 线程的概念217 主线程public class GetThread public static void main(String args) Thread thread =Thread.currentThread(); System.out.println(); System.out.println(); System.out.println(); System.out.println();运行结果:6.1 线程的概念226.2 线程同步有时两个或多个线程可能会试图同时访问一个资源 例如,一个线程可能尝试从一个文件中

18、读取数据,而另一个线程则尝试在同一文件中修改数据或写数据在此情况下,数据可能会变得不一致为了确保在任何时间点一个共享的资源只被一个线程占用,就要用到线程同步。23我们把一次只允许一个线程使用的共享资源称为临界资源,而在每个进程中访问临界资源的程序段称为临界区。临界区是一个对象,它是互斥体。当一个线程进入互斥体,互斥体就锁定,此时任何试图进入互斥体的线程都必须等待这个线程出来。在Java表示临界区或实现线程同步是通过关键字synchronized:如使用同步方法synchronized void methodA() 同步的例子:模拟打电话的过程。PhoneCall类中的call就是临界区,一旦有

19、线程进入其它线程只有等该线程出来才能进去。在Call线程类中,生成三个线程同时调用call()临界区程序。6.2 线程同步临界资源和临界区24PhoneCall类中的call就是临界区,因此用synchronized标志。一旦有线程进入该临界区,其它线程只有等该线程出来才能进去。public class PhoneCall public synchronized static void call(String name) try System.out.println(name+拨打电话); Thread.sleep(100); System.out.println(name+正在通话中.);

20、Thread.sleep(100); System.out.println(name+挂断电话); catch(InterruptedException e)e.printStackTrace(); 6.2 线程同步25public class Call extends Thread public Call(String arg0)super(arg0);public void run()PhoneCall.call(getName();public static void main(String args) Call first=new Call(First);Call second=new

21、 Call(Second);Call third=new Call(Third);first.start();second.start();third.start();6.2 线程同步Call类是个线程类,run()方法调用call()进入临界区。Main()方法实例化3个线程,同时启动它们。26在call()方法前没加synchronized 的运行结果:Second拨打电话Third拨打电话First拨打电话First正在通话中.Second正在通话中.Third正在通话中.First挂断电话Second挂断电话Third挂断电话6.2 线程同步27在call()方法前加synchroni

22、zed 的运行结果:Third拨打电话Third正在通话中.Third挂断电话Second拨打电话Second正在通话中.Second挂断电话First拨打电话First正在通话中.First挂断电话6.2 线程同步28Java程序中多个线程是通过消息实现线程间的通信.利用 wait(),notify()和 notifyAll()方法发送消息实现进程间的相互联系.wait() 方法,线程主动调用wait()方法释放临界区等待某个条件满足,,等待其他线程用notify()唤醒。 notify()唤醒相同对象中第一个调用wait()的线程。 notifyAll()唤醒所有调用 wait()的线程。

23、具有最高优先级的线程最先运行线程通信6.2 线程同步29生产者-消费者的问题例子:一个简单生产者-消费者的问题。生产者将产品书放入书架中,而消费者则从书架中取走书.在这个过程中,消费者只有在书架上有书时才能提货,若没有货则消费者必须调用wait()方法等待,而生产者放入书后通过调用notify()方法唤醒消费者取货。同样书架中的书在未取走前,生产者也要等待weit(),消费者取走后再唤醒它(调用notify())该程序由四个类组成:Bookcase(书架,模拟取书、存书);Producer(生产者线程对象);Consumer(消费者线程对象);以及主程序类6.2 线程同步30Producer类

24、:该类是个线程类。生产者将10本书存储在BookCase的对象中,表示将书放入书架。class Producer extends Thread private BookCase bookcase; public Producer(BookCase b) bookcase = b; public void run() for(int i=0; i 10; i+) String book = Book+i; bookcase.put(book); 6.2 线程同步31Consumer类:消费者线程则不断从BookCase对象中取这些书。class Consumer extends Thread p

25、rivate BookCase bookcase; public Consumer(BookCase b) bookcase = b; public void run() String book = ; for(int i=0;i10; i+) book = bookcase.get(); 6.2 线程同步32在这个例子中,生产者与消费者通过BookCase对象来共享数据。put()和get()方法是临界区。在生产者放入书的同时消费者不能取书。反之也是。因此put()和get()方法必须用synchronized关键字标志起来。生产者调用BookCase的put()方法时,它就锁住BookCa

26、se。以阻止消费者访问BookCase中的get()方法。获得对象锁的线程可以通过调用Wait()方法主动释放锁,到等待队列去等待条件满足。这时其它线程可以得到锁从而访问该对象。之后可以通过调用notify()唤醒先前因调用wait()而等待的线程BookCase类6.2 线程同步33class BookCase private String Book; private boolean available = false; public synchronized String get() while(available = false) try wait(); catch(InterruptedException e) available = false; notifyAll(); System.out.println(Consumer got: +

温馨提示

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

评论

0/150

提交评论