资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,面向对象的程序设计,对外经济贸易大学 雷擎,面向对象的程序设计,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,7,章,线程,对外经济贸易大学信息学院,content,7.1 多线程根底,7.2 线程的生命周期,7.3 生产者与消费者问题,实验:多线程,7.1 多线程根底,7.1.1,线程的概念,7.1.2 Thread,类和,Runnable,接口,7.1.3,在程序中实现多线程,7.1.1 线程的概念,线程和进程都是指正在执行的程序代码,是与计算机中的并发执行相关的概念。,通过操作系统的调度,多个进程和线程可以同时、独立的执行。,线程与进程的区别:,多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响.,线程本身的数据通常只有存放器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。,多线程是Java的内嵌特性,Java 虚拟机允许应用程序并发地运行多个执行线程。,线程与进程的区别,7.1.2 Thread类和Runnable接,Java,中实现多线程有两种途径:继承,Thread,类或者实现,Runnable,接口。,Thread,类实现,Runnable,接口。,创立线程的方式,1.,继承类,Thread,public class,mythread,extends,Thread, ,2.,实现,Runnable,接口,public class,mythread,extends,SuperClass,implements,Runnable, ,上述两种方法中都可用类,Thread,产生线程的对象,Thread newthread;,定义一个,Thread,类的子类,步骤:,1. 定义一个Thread类的子类,并override run()方法,在这个方法里是你希望这个线程运行的代码,2. 创立一个这个新类的对象,3. 调用Thread对象的start()方法来启动线程,实现Runnable接口,步骤:,1. 定义一个类,实现Runnalbe接口,并override run()方法,在这个方法里是你希望这个线程运行的代码,2. 创立一个这个新类的对象,3. 创立一个Thread类的对象,用刚刚的Runnable对象作为构造函数参数,4. 调用Thread对象的start()方法来启动线程,7.1.3 在程序中实现多线程,一个龟兔赛跑的例子,使用线程模拟了龟兔在,1000,米赛跑过程。,1.定义一个Thread类的子类,class Runner extends Thread ,String name;,double distance;,Random rand = new Random();,public Runner(String name),this.name = name;,public void run() ,distance = 0.0;,for (int i = 0; i 10; i+) ,distance += 100.0;,int sleepTime = rand.nextInt(2000);,System.,out,.println(name +,跑了,+ distance + ,米,t,休息, + sleepTime + ,毫秒,);,try ,Thread.,sleep,(sleepTime);, catch (InterruptedException inte) ,System.,out,.println(name+,跑到了终点,);,使用定义好的Runner线程,import java.util.Random;,public class DemoThreadSimple ,public static void main(String args) ,/创立并命名每个线程,Runner rabbit = new Runner(rabbit);,Runner tortoise = new Runner(“tortoise);rabbit.setPriority(Thread.NORM_PRIORITY);tortoise.setPriority(Thread.NORM_PRIORITY+5);,rabbit.start();/ 启动线程1,tortoise.start();/ 启动线程1,2.实现Runnable接口,class JumpBean implements Runnable ,private int sleepTime;,public JumpBean()/,构造方法,sleepTime = (int) (Math.,random,() * 6000);/,获得随机休息毫秒数,数组元素初始化的例子,int aI; aI=new int10;,String aS; aS=new String3;,Circle aC; aC=new Circle5;,int k =0 ;,for(k=0;k10;k+) ,aIk = k*k;,aS0 = aaa;,aS1 = new String(bbb);,aS3 = new String(ccc);,for(k=0;k5;k+) ,aCk = new Circle();,public void run(),try System.,out,.println(Thread.,currentThread,().getName()+ going to sleep for + sleepTime);,/,区别,:,因为不是继承,Thread,类,因而必须先调用,currentThread,方法,Thread.,sleep,(sleepTime); /,线程休眠, catch (InterruptedException exception) ,System.,out,.println(Thread.,currentThread,().getName() + finished);,/,运行结束,给出提示信息,构造并发执行的线程,public class DemoRunnableSimple ,public static void main(String args) ,/创立3个实现Runnable接口类的对象,JumpBean thread1 = new JumpBean();,JumpBean thread2 = new JumpBean();,JumpBean thread3 = new JumpBean();,System.out.println(Starting threads);,/分别以三个对象为参数创立三个新线程,第二个参数为新线程命名并启动之,new Thread(thread1, jumpbeanOne).start();,new Thread(thread2, jumpbeanTwo).start();,new Thread(thread3, jumpbeanThree).start();,System.out.println(Threads started, main endsn);,public class MyArray ,public static void main(String args),int myArray; /声明数组,myArray=new int10; /创立数组,System.out.println(IndexttValue);,for(int i=0; imyArray.length;i+),System.out.println(i+tt+myArrayi);,/证明数组元素默认初始化为0,/myArray10=100; /将产生数组越界异常,数组引用例子,3. 线程的优先权,Java,的线程调度的优先级为,1-10,的整数,优先级随数的大小增减。,Thread,类设置了特定的级别:,MIN-PRIORITY,NOM_PRIORITY,MAX-PRIORITY,某一时刻只有一个线程在执行,调度策略为固定优先级调度,.,newthread.setPriority(Thread.MIN_PRIORITY),7.2 线程的生命周期,线程的生命周期是线程从产生到终止的全过程,一个线程在任何时刻都处于某种线程状态。,一个线程的生命周期由线程类、新线程New Thread、就绪状态Ready、运行状态Running、阻塞状态Blocked、等待状态Waiting和定时等待状态Timed Waiting和终止状态Terminated。,7.3 生产者与消费者问题,生产者与消费者问题是从操作系统中的许多实际同步问题中抽象出来的具有代表性的问题,反映了操作系统中典型的同步例子。,生产者生产消息,放入消息缓冲区;消费者从消息缓冲区中获取消息,使用消息。,同步关系,生产者线程与消费者线程之间存在的同步关系如下:,同一时刻只能有一个生产者或者一个消费者访问消息缓冲区。,当消息缓冲区为空时,消费者等待生产者生产消息;当消息缓冲区满时,生产者等待消费者消费消息。,关键问题,生产者与消费者问题实现中的关键问题有:,缓冲区采用数组实现的循环队列:缓冲区空的条件为,rear=front,,缓冲区为满的条件为,(rear + 1) % size = front,;,随机数对象,Random rand = new Random(),用于产生线程等待的随机毫秒数;,线程的退出:处于运行状态的线程通过置,toStop,标志为,true,使线程从,run(),方法返回;处于等待状态的线程由于无法自己醒过来,需要置,toStop,标志为,true,,主程序唤醒它们之后才能检测到,toStop,标志。,小结,7.1 多线程根底,7.2 线程的生命周期,7.3 生产者与消费者问题,知识点提示:,理解,线程的概念,线程和进程的区别,Java,多线程实现的机制,消费者和生产者的原理,掌握,利用,Thread,和,Runnable,实现多线程程序,实验:多线程,实验,11,:多线程,End of Chapter 7,
展开阅读全文