第7章多线程 北京大学计算机系 代亚非
第7章 多线程 北京大学计算机系 代亚非
第7章多线程 71多线程基本概念 72创建线程的方式 73线程的挂起与唤醒 74多线程问题 75小结
2 第 7 章 多线程 7.1 多线程基本概念 7.2 创建线程的方式 7.3 线程的挂起与唤醒 7.4 多线程问题 7.5 小结
多线程基本概念 3 文件各种系统资源输入输出装置文件各种系统资源输入输出装置 三数据区段 匚数据区段 程序区段 程序区段 只有一个地方在执行 同时有数个地方在执行 传统的进程 多线程的任务
3 7.1 多线程基本概念 文件 各种系统资源 输入输出装置 数据区段 程序区段 只有一个地方在执行 文件 各种系统资源 输入输出装置 数据区段 程序区段 同时有数个地方在执行 传统的进程 多线程的任务
7.1多线程基本概念 多线程的优势: 减轻编写交互频繁、涉及面多的程序的困难 程序的吞吐量会得到改善 由多个处理器的系统可以并发运行不同的线 程(否则,任何时刻只有一个线程在运行)
4 7.1 多线程基本概念 多线程的优势: 减轻编写交互频繁、涉及面多的程序的困难. 程序的吞吐量会得到改善. 由多个处理器的系统,可以并发运行不同的线 程.(否则,任何时刻只有一个线程在运行)
71多线程基本概念 线程与进程的区别: 多个进程的内部数据和状态都是完全独立的 而多线程是共享一块内存空间和一组系统资 源有可能互相影响. 线程本身的数据通常只有寄存器数据,以及 个程序执行时使用的堆栈,所以线程的切 换比进程切换的负担要小
5 7.1 多线程基本概念 线程与进程的区别: 多个进程的内部数据和状态都是完全独立的, 而多线程是共享一块内存空间和一组系统资 源,有可能互相影响. 线程本身的数据通常只有寄存器数据,以及 一个程序执行时使用的堆栈,所以线程的切 换比进程切换的负担要小
71多线程基本概念 对线程的综合支持是Java技术的一个重要特 色它提供了 thread类、监视器和条件变量的 技术 虽然 Macintosh, Windows nt, Windows9等操 作系统支持多线程,但若要用C或C+编写多 线程程序是十分困难的,因为它们对数据同 步的支持不充分
6 7.1 多线程基本概念 对线程的综合支持是Java技术的一个重要特 色.它提供了thread类、监视器和条件变量的 技术. 虽然Macintosh,Windows NT,Windows 9等操 作系统支持多线程,但若要用C或C++编写多 线程程序是十分困难的,因为它们对数据同 步的支持不充分
创建线程的方式 public class mythread extends applet implements runnable (小应用或已经是某个类的子类时 2.继承类 Thread public class mythread extends Thread 3.上述两种方法中都可用类 Thread产生线程的 对象 TThread newthread; 4.创建并启动线程 newthread=new Thread(this); newthread start;
7 7.2 创建线程的方式 1. public class mythread extends Applet implements Runnable (小应用或已经是某个类的子类时) 2. 继承类Thread public class mythread extends Thread 3. 上述两种方法中都可用类Thread产生线程的 对象 Thread newthread; 4. 创建并启动线程 newthread=new Thread(this); newthread.start();
72创建线程的方式 5run方法是运行线程的主体,启动线程时,由 java直接调用 public void runo 6停止线程由小应用程序的sop调用线程的 stop newthread stope 7 sleep方法的作用暂停线程的执行,让其它线 程得到机会,see要丢出异常,必须抓住 Trysleep(100)catch(Interrupted Exception e0 例:小应用程序中不用 Runnable接口仍然可以 使用线程(不调用主类的方法和调用主类的方 法)
8 7.2 创建线程的方式 5. run方法是运行线程的主体,启动线程时,由 java直接调用 public void run() 6.停止线程,由小应用程序的stop调用线程的 stop newthread.stop() 7 sleep方法的作用,暂停线程的执行,让其它线 程得到机会,sleep要丢出异常,必须抓住. Try{sleep(100)}catch(InterruptedException e){} 例:小应用程序中不用Runnable接口仍然可以 使用线程(不调用主类的方法和调用主类的方 法)
72创建线程的方式 import java applet. *i public class thread extends applet i mythread tl=new mythreado public inito i tIstart; class mythread extends Thread i public void runo f for (int i=0; K<4; i++) System. out printIn(2+i i trytsleep(400) 3 catch(Interupted Exception er
9 import java.applet.*; public class thread extends Applet { mythread t1=new mythread(); public init() { t1.start();} class mythread extends Thread { public void run() { for (int i=0;i<4;i++) System.out.println( “”+i); { try{sleep(400); } catch(InteruptedException e){ } } } 7.2 创建线程的方式
public class mainclass extends applet i C tI=new C(this) public void initoi tl start;3 public void paint(graphics g) i g drawString Hello,java", 10, 50);3) class c extends Thread mainclass a C(mainclass b) {a=b;} public void runo i while(truer a repaint; tryisleep (400);} catch(InterruptedException e)0))
10 7.2 创建线程的方式 public class mainclass extends Applet { C t1=new C(this); public void init() { t1.start();} public void paint(Graphics g) { g.drawString("Hello,java",10,50);}} class C extends Thread { mainclass a; C(mainclass b) { a=b; } public void run() { while(true){ a.repaint(); try{sleep(400);} catch(InterruptedException e){} }}