JAVA程序员培训定制课程c13.ppt_第1页
JAVA程序员培训定制课程c13.ppt_第2页
JAVA程序员培训定制课程c13.ppt_第3页
JAVA程序员培训定制课程c13.ppt_第4页
JAVA程序员培训定制课程c13.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、第十三章,线 程,2,本章内容,线程的概念模型 线程的创建和启动 线程的状态控制 临界资源、对象锁和死锁 线程的互斥和同步,3,什么是线程,线程是一个程序内部的顺序控制流。 线程和进程 每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大。 线程: 轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。 多进程: 在操作系统中能同时运行多个任务(程序) 多线程: 在同一应用程序中有多个顺序流同时执行,4,线程的概念模型,虚拟的CPU,由java.lang.Thread类封装和虚拟 CPU所执行的代码,传递给Thread类对象。 CP

2、U所处理的数据,传递给Thread类对象。,代 码,数 据,虚拟CPU,Java线程模型,5,线程体,Java的线程是通过java.lang.Thread类来实现的。 每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。,6,创建线程 -通过实现Runnable接口,public class TestThread1 public static void main(String args) Runner1 r = new Runner1(); Thread t = new Thread(r); t.start(); class Runner

3、1 implements Runnable public void run() for(int i=0; i30; i+) System.out.println(No. + i); ,7,多线程,Java中引入线程机制的目的在于实现多线程 可以使用同一个Runnable接口(的实现类)类型的实例构造多个线程 多线程之间可以共享代码和数据 举例 Thread t1 = new Thread(r); Thread t2 = new Thread(r);,8,多线程举例,public class TestThread2 public static void main(String args) Run

4、ner2 r = new Runner2(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start(); t2.start(); class Runner2 implements Runnable public void run() for(int i=0; i30; i+) System.out.println(No. + i); ,9,多线程共享数据和代码,class MyRunner implements Runnable class YourRunner implements Runnable MyRunner

5、m = new MyRunner(); YourRunner y1 = new YourRunner(); YourRunner y2 = new YourRunner(); Thread t1 = new Thread(m); Thread t2 = new Thread(y1); Thread t3 = new Thread(y2); Thread t4 = new Thread(y2);,10,启动线程,使用start() 方法启动线程 启动线程是使线程进入到可运行(runnable)状态,并不一定立即开始执行该线程 public class TestThread1 public sta

6、tic void main(String args) Runner1 r = new Runner1(); Thread t = new Thread(r); t.start(); ,11,线程状态转换(Thread Scheduling),12,线程状态转换举例,public class TestThread3 public static void main(String args) Runner3 r = new Runner3(); Thread t = new Thread(r); t.start(); class Runner3 implements Runnable public

7、void run() for(int i=0; i30; i+) if(i%10=0 ,13,终止线程控制举例,public class TestThread4 public static void main(String args) Runner4 r = new Runner4(); Thread t = new Thread(r); t.start(); for(int i=0;i0) System.out.println(in thread main i= + i); System.out.println(Thread main is over); r.shutDown(); clas

8、s Runner4 implements Runnable private boolean flag=true; public void run() int i = 0; while (flag=true) System.out.print( + i+); public void shutDown() flag = false; ,14,线程控制基本方法,15,join方法用法举例,public class TestThread5 public static void main(String args) Runner5 r = new Runner5(); Thread t = new Thr

9、ead(r); t.start(); try t.join(); catch(InterruptedException e) for(int i=0;i50;i+) System.out.println(主线程: + i); class Runner5 implements Runnable public void run() for(int i=0;i50;i+) System.out.println(SubThread: + i); ,16,创建线程的第二种方式 -继承Thread类,public class TestThread6 public static void main(Stri

10、ng args) Thread t = new Runner6(); t.start(); class Runner6 extends Thread public void run() for(int i=0;i50;i+) System.out.println(SubThread: + i); ,17,两种创建线程方法的比较,使用Runnable接口 可以将CPU,代码和数据分开,形成清晰的模型; 还可以从其他类继承; 保持程序风格的一致性。 直接继承Thread类 不能再从其他类继承; 编写简单,可以直接操纵线程,无需使用Thread.currentThread()。,18,Ex1,分析并

11、运行M13-6页的例子,体会通过实现Runnable接口创建线程的过程; 细化M13-16页程序,体会并实现通过继承Thread类创建线程,并要求实现下述输出结果:连续输出26个大写字母A Z ;,19,线程的调度,Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪些线程来执行。 setPriority(int)方法设置优先级 多数线程的调度是抢先式的。 时间片方式 非时间片方式,20,下面几种情况下,当前线程会放弃CPU: 线程调用了yield(),suspend()或sleep()方法主动放弃; 由于当前线程进行I/O访问,外存读写,

12、等待用户输入等操作,导致线程阻塞; 为等候一个条件变量,线程调用wait()方法; 抢先式系统下,有高优先级的线程参与调度;时间片方式下,当前时间片用完,有同优先级的线程参与调度。,线程的调度,21,线程的优先级,线程的优先级用数字来表示,范围从1到10,一个线程的缺省优先级是5 Thread.MIN_PRIORITY = 1 Thread.MAX_PRIORITY = 10 Thread.NORM_PRIORITY = 5 使用下述线方法获得或设置线程对象的优先级 int getPriority(); void setPriority(int newPriority);,22,临界资源问题(

13、1),class Stack int idx=0; char data = new char6; public void push(char c) dataidx = c; idx+; public char pop() idx-; return dataidx; 两个线程A和B在同时操纵Stack类的同一个实例(堆栈),A正在往堆栈里push一个数据,B则要从堆栈中pop一个数据。,23,1. 操作之前 data = | a | b | | | | | idx=2 2.A执行push中的第一个语句,将c推入堆栈; data = | a | b | c | | | | idx=2 3.A还未执

14、行idx+语句,A的执行被B中断,B执行pop方法,返回b: data = | a | b | c | | | | idx=1 4.A继续执行push的第二个语句: data = | a | b | c | | | | idx=2 最后的结果相当于c没有入栈,产生这种问题的原因在于对共享数据访问的操作的不完整性。,临界资源问题(2),24,在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。 关键字synchronized 来与对象的互斥锁联系。当某个对象用synchroniz

15、ed修饰时,表明该对象在任一时刻只能由一个线程访问。,互斥锁,25,关键字Synchronized用法举例,public void push(char c) synchronized(this) dataidx=c; idx+; public char pop() synchronized(this) idx-; return dataidx; ,26,关键字Synchronized,synchronized 除了象上面放在对象前面限制一段代码的执行外,还可以放在方法声明中,表示整个方法为同步方法。 public synchronized void push(char c) 如果synchro

16、nized用在类声明中,则表明该类中的所有方法都是synchronized的。 public synchronized class Stack ,27,实现多线程的同步,class SyncStack /支持多线程同步操作的堆栈的实现 private int index = 0; private char data = new char6; public synchronized void push(char c) while(index = data.length) try this.wait(); catch(InterruptedException e) this.notify(); d

17、ataindex = c; index+; public synchronized char pop() while(index =0) try this.wait(); catch(InterruptedException e) this.notify(); index-; return dataindex; ,28,生产者-消费者问题(1),生产者: class Producer implements Runnable SyncStack stack; public Producer(SyncStack s) stack = s; public void run() for(int i=0

18、; i20; i+) char c =(char)(Math.random()*26+A); stack.push(c); System.out.println(生产:+c); try Thread.sleep(int)(Math.random()*100); catch(InterruptedException e) ,29,消费者: class Consumer implements Runnable SyncStack stack; public Consumer(SyncStack s) stack = s; public void run() for(int i=0;i20;i+) char c = stack.pop(); System.out.println(消费: +c); try Thread.sleep(int)(Math.random()*1000); catch(InterruptedException e) ,生产者-消费者问题(2),30,生产者-消费者问题(3),主程序: public class SyncTest publi

温馨提示

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

评论

0/150

提交评论