北京大学JAVA讲义__第七章 多线程

合集下载

第7章 多线程

第7章 多线程

System.out.println("运行main()方法");

}

}
}
class ThreadTest {
void run() {

while (true) {

System.out.println("运行run()方法");

}

}
}
案例2:多线程方式的程序
package chapter7;
案例1:单线程方式的程序
package chapter7;
public class SingleThreadSample {
public static void main(String[] args) {

new ThreadTest().run();

while(true) {

进程与线程的区别
DOS系统有一个非常明显的特点,只要一中病毒之后 则系统会立刻死机,因为传统的DOS系统是采用单进 程的处理方式,所以只能有一个程序独自运行,其他程 序无法运行。 windows系统中,即使出现了病毒,系统照样可以正 常使用,因为在windows中采用的是多进程的处理方式, 那么在同一个时间段上会有多个程序同时进行。 对于word来说,每次启动一个word之后实际上都是 在操作系统上分配了一个进程。 线程实际上就是在进程基础之上的进一步划分,从 word来看,可以把拼写检查当作一个线程进行处理。 当然,会同时存在多个线程。
(3) 调用该类的start()方法启动线程。
注意:一定不能直接调用Thread类或其子类的 run()方法,这样虽可执行相应的代码来完成 指定的任务,但并不会启动新的线程。

Java07(第7章)

Java07(第7章)

线程的同步
• 问题的解决
– 同步: 用synchronized关键字前缀给针对共享 资源的操作加锁;同步方法、同步块
synchronized void push(); synchronized int pop();
– 实现机制:管程 银行取款例子例子7-7 作业:模拟医院挂号。
强调: 1、join()方法;例如:Example_join.java 2、线程优先级;TestPriority.java 3、yield()方法;TestYield.java 4、线程间需协调与通讯:生产者/消费 者问题(wait(),notify(),notifyAll()); TestMultiThread.java 查阅资料,了解: 5、ThreadLocal类; 6、ThreadGroup类与destroy()方法; 7、interrupt()方法;8、例7-8
2、线程的生命周期 、
• 线程要经历创 就绪、 建、就绪、运 行、阻塞和死 亡等5个状态 亡等 个状态 , 称为生命周期。 称为生命周期。
线程状态
消亡 new Thread(..) 新建状态 run() 结束 stop() CPU调度 就绪状态 yield() I/O完成 sleep时间到 notify() I/O sleep() 等待状态 wait() 执行状态
Java语言程序设计 语言程序设计
清华大学出版社
第7章 多线程与异常处理
第7章 章
多线程与异常处理
1、多线程的概念 、 2、线程的使用 、 3、线程同步 、 4、异常处理 、
7.1 多线程的概念
1、线程与多线程 、 2、线程的生命周期 、 3、线程的优先级 、
程序 - 进程 - 线程
• 程序是为完成特定任务、用某种语言编写的 一组指令的集合。指一段静态的代码。 • 进程是程序的一次执行过程,是系统进行调 度和资源分配的一个独立单位。

java 多线程 原理

java 多线程 原理

Java多线程的基本原理什么是多线程在计算机科学中,线程是指进程中的一个执行流程。

一个进程可以有多个线程,每个线程都可以独立执行不同的任务。

多线程可以提高程序的并发性和响应性,使得程序能够同时处理多个任务。

Java是一种支持多线程编程的面向对象编程语言。

通过使用Java的多线程机制,可以实现并发执行的程序,提高程序的执行效率和性能。

多线程的优点和用途多线程编程可以带来以下几个优点:1.提高程序的执行效率:多线程可以让程序同时执行多个任务,从而提高程序的执行效率。

特别是在计算密集型任务和IO密集型任务中,多线程可以充分利用CPU和IO资源,提高程序的执行速度。

2.提高程序的响应性:多线程可以让程序同时处理多个任务,当一个任务需要等待IO操作完成时,可以切换到其他任务继续执行,保持程序的响应性。

3.提高代码的可维护性:多线程可以将复杂的任务拆分成多个小任务,每个小任务由一个线程独立执行,简化了程序的设计和实现。

多线程广泛应用于以下几个领域:1.Web服务器:通过使用多线程,可以同时处理多个客户端的请求,提高服务器的并发性能。

2.数据库管理系统:多线程可以同时处理多个数据库请求,提高数据库的并发性能。

3.游戏开发:多线程可以实现游戏中的多个角色同时执行,提高游戏的流畅度和响应性。

Java多线程的实现方式Java多线程可以通过两种方式来实现:1.继承Thread类:通过继承Thread类,并重写run()方法来实现多线程。

2.实现Runnable接口:通过实现Runnable接口,并实现run()方法来实现多线程。

这两种方式都可以实现多线程,但是使用实现Runnable接口的方式更加灵活,因为Java不支持多重继承,所以如果一个类已经继承了其他类,就无法再继承Thread类了,但是可以实现Runnable接口。

线程的生命周期在Java中,线程有以下几个状态:1.新建状态(New):当一个Thread对象被创建时,它就处于新建状态。

java 多线程讲解

java 多线程讲解

多线程是java应用程序的一个特点,掌握java的多线程也是作为一java 程序员必备的知识。

多线程指的是在单个程序中可以同时运行多个同的线程执行不同的任务.线程是程序内的顺序控制流,只能使用分配给序的资源和环境。

还记得刚开始学习的时候总是和进程分不清,总是对这两个名词所迷惑。

下面就首先对这两个名词区分来作为本篇博客的开始:一、线程与进程的区别多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响. •线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。

多线程编程的目的,就是"最大限度地利用CPU资源",当某一线程的处理不需要占用CPU而只和I/O等资源打交道时,让需要占用CPU资源的其它线程有机会获得CPU资源。

从根本上说,这就是多线程编程的最终目的。

二、了解一下java在多线程中的基础知识1.Java中如果我们自己没有产生线程,那么系统就会给我们产生一个线程(主线程,main方法就在主线程上运行),我们的程序都是由线程来执行的。

2. 进程:执行中的程序(程序是静态的概念,进程是动态的概念)。

3. 线程的实现有两种方式,第一种方式是继承Thread类,然后重写run 方法;第二种是实现Runnable接口,然后实现其run方法。

4. 将我们希望线程执行的代码放到run方法中,然后通过start方法来启动线程,start方法首先为线程的执行准备好系统资源,然后再去调用run方法。

当某个类继承了Thread类之后,该类就叫做一个线程类。

5. 一个进程至少要包含一个线程。

6. 对于单核CPU来说,某一时刻只能有一个线程在执行(微观串行),从宏观角度来看,多个线程在同时执行(宏观并行)。

7. 对于双核或双核以上的CPU来说,可以真正做到微观并行。

三、Thread源码研究:1) Thread类也实现了Runnable接口,因此实现了Runnable接口中的run方法;2) 当生成一个线程对象时,如果没有为其设定名字,那么线程对象的名字将使用如下形式:Thread-number,该number将是自动增加的,并被所有的Thread对象所共享(因为它是static的成员变量)。

Java线程 北大计算机系java培训讲义

Java线程 北大计算机系java培训讲义

7.4 多线程问题---线程间的通信

25
管道流不能直
接读写
DataInputStream
printStream
PrintStream p = new PrintStream( pos );
p.println(“hello”); DataInputStream d=new DataInputStream(pis); d.readLine(); 2. 通过一个中间类来传递信息.
}


7.3 线程的挂起与唤醒

17

暂停线程的执行等待条件满足再执行. 下面的例子显示线程的挂起和唤醒 小应用程序第一次开始时,线程被启动 浏览器改变页面时,小应用程序的stop()方法 被调用,线程被挂起. 浏览器回到原来的页面时,线程被唤醒.
7.3 线程的挂起与唤醒
18
public void start() { if (mythread==null) {mythread=new Thread(); mythread.start();} else { mythread.resume();} } public void run() { while(true){ try{sleep(100);} catch(InterruptedException e) {}} } public void stop() { mythread.suspend(); }.
7.2 创建线程的方式
11. 线程的状态
new Thread() start() New Thread stop() yield() . . Runnable suspend() sleep() wait()
13
.
Not Runnable

第7章 多线程

第7章 多线程

主 要 内 容
2 3 4
5
6
Java语言程序设计
第7章 多线程
7.1多线程的基本概念
序列化程序的特点是只有一个入口、一个可执行的命 多线程的应用范围很广。在一般情况下,程序的一些 令序列、一个出口。在程序执行的任何时刻,只有一个执 部分同特定的事件或资源联系在一起,同时又不想为它而 行点。线程和序列化程序类似,也有一个入口、执行序列 暂停程序其他部分的执行,这种情况下,就可以考虑创建 和出口,执行时也只有一个执行点。但是线程不是程序, 一个线程,令它与那个事件或资源关联到一起,并让它独 它不能自己独立运行,只有在程序中执行。线程是一个程 立于主程序运行。通过使用线程,可以避免用户在运行程 序内部的顺序控制流,即程序中的一条执行路径。当同一 序和得到结果之间的停顿,还可以让一些任务(如打印任 个程序中有多条执行路径并发执行时,就称之为多线程 务)在后台运行,而用户则在前台继续执行一些其他的工 (Multi-Thread)。换句话说,在多线程中允许一个程序创 作。总之,利用多线程技术,可以使编程人员方便地开发 建多个并发执行的线程来完成各自的任务。 出能同时处理多个任务的功能强大的应用程序。
Java语言程序设计
第7章 多线程
7.4 线程的同步
Java语言程序设计
第7章 多线程 7.4.1 共享受限资源
7.4 线程的同步
synchronized关键字的语法格式有两种: synchronized(object){同步代码段} //object可以是任意一个对象 在多线程的程序中,要求各个线程对共享资源的访问是互斥的。比如,铁路售票系 将前面的售票代码修改一下,使之具有同步的效果: 统,有4个售票点发售某日某次列车的100张车票,票(ticket)是共享资源,其中,一个 String str=new String(“ “); 售票点在发售某张票的时候哦,其余售票点便不能进行售票,必须等这个售票点发售 synchronized(str) { 完这张票,并释放对共享资源(ticket)的使用权后才能进行售票。如下面的代码: if(ticket>0) if(ticket>0) System.out.println(Thread.currentThread( ).getName( )+”is sailing ticket”+tickets --); System.out.println(Thread.currentThread( ).getName( )+”is sailing ticket”+tickets --); } 即当一个售票线程运行到if(ticket>0)语句后,CPU必须等到if语句执行完毕才去执行其他售 程序中用String str=new String(“ “)语句随便产生了一个对象,用于后面的同步代码段。 票线程的相应代码段。 (2)synchronized作为方法的修饰字,使该方法成为同步方法。当一个线程在使用实例 Java中对共享数据操作的并发控制是采用传统的封锁技术。在Java中为保证线程对共享 对象的某个同步方法时,试图调用该实例对象任何同步方法的其他线程都必须等待, 资源操作的完整性,用synchronized关键字为共享资源加锁来解决,称为互斥锁。每个共 直至该线程退出同步方法。然后该实例对象的不同步方法仍然可以被调用。 享资源对象都有一个互斥锁标记,保证任一时刻只能有一个线程访问该对象。 例如定义pop( )为同步方法: public synchronized void pop( ){ …. }

java 第7章 多线程

java 第7章 多线程

Thread类方法总结
启动线程:start()
有关线程执行的控制: – stop()、suspend()、resume()
7
有关调度控制 – Thread.sleep(10); //低优先级的线程也可以获得执行 – Thread.yield(); //同优先级的线程可以获得执行 – suspend(); //暂停本线程
Java的多线程机制 10
线程 结束 stop() CPU调度 执行状态 yield() I/O完成 sleep时间到
Java的多线程机制
new Thread(..)
新建状态
start()
就绪状态
I/O sleep() 等待状态
11
Java对多线程的支持
提供对多线程的支持 Thread类
4
基本概念之一:进程
进程是正在运行的一个程序
程序:静态对象--进程:动态过程 操作系统为每个进程分配一段内存空间,
7
包括:代码、数据以及堆栈等资源 多任务的操作系统(OS)中,进程切换对 CPU资源消耗较大
Java的多线程机制
5
基本概念之二:多线程
7
多线程是指同时存在几个执行体,按几条不
– 使用start()启动线程
Java的多线程机制 22
方法之二:Runnable(续)
例: class A implements Runnable{ public void run(){….} } class B { public static void main(String[] arg){ Runnable a=new A(); Thread t=new Thread(a); t.start(); } }

第七章 线程(4学时)

第七章 线程(4学时)
可在线程创建之后的任何时候,通过 setPriority(int priority)方法改变其原来的 优先级。
30
基于线程优先级的线程调度: 具有较高优先级的线程比优先级较低的 线程优先执行; 对具有相同优先级的线程,Java的处理 是随机的; 底层操作系统支持的优先级可能要少于 10个,这样会造成一些混乱。因此,只 能将优先级作为一种很粗略的工具使用。 最后的控制可以通过使用yield()函数来 完成。
9
运行结果: main thread starts main thread ends new thread started The factorial of 10 is 3628800 new thread ends
10
结果说明: main线程已经执行完后,新线程才执行完;
main函数调用thread.start()方法启动新线程
停止线程运行,释放该线程占用的 对象锁旗标。 打断此线程 在当前线程中加入调用join方法的线 程A,直到线程A死亡才能继续执行 当前线程
在当前线程中加入调用join方法的线 程A,直到到达参数指定毫秒数或线 程A死亡才能继续执行当前线程
16
public final void setPriority( int newPriority) public final void setDaemon(Boolean on)
例7-3:使用Runnable接口实现例7_1功能 例7-4:使用Runnable接口实现例7_2功能
24
7.2 线程的生命周期及调度
7.2.1线程生命周期 线程从产生到消亡的过程 ; 一个线程在任何时刻都处于某种线程状
态(thread state)。
25

第7章多线程

第7章多线程

1.引入线程机制的动机和思路 操作系统采用进程机制使得多个程序能够并发执行,提 高了资源使用率和系统效率。在 早期操作系统中,进 程是系统进行资源分配的基本单位,也是处理器调度的 基本单位,进程 在任一时刻只有一个执行控制流,这 种结构的进程称为单线程(结构)进程( single threaded process)。例如, MS-DOS支持单用户进程,进程是单 线程的;传统的UNIX支持多用户进 程,每个进程也是单 线程的。单线程进程调度时存在进程时空开销大、进程 通信代价大、进 程并发粒度粗、不适合于并行计算等 问题,操作系统引入线程机制来解决这些问题。 线程机制的基本思路是,把进程的两项功能一一"独立 分配资源"和"被调度分派执行" 分离,前一项任务仍由 进程完成,后一项任务交给称为线程的实体完成。这样, 进程作为系 统资源分配与保护的独立单位,不需要频 繁地切换;线程作为系统调度和分派的基本单位, 会被 频繁地调度和切换。
7.1 操作系统中的进程与线程
7.1.1 进程 1 .进程的定义和属性 进程(process)是一个可并发执行的具有独立功能的程序 (program)关于某个数据集口 的一次执行过程,也是操作系统 进行资源分配和保护的基本单位。进程具有以下属性: 结构性一一进程包含了数据集合和运行于其上的程序。每个进 程至少由三要素组成: 程序块、数据块和进程控制块。其中, 进程控制块(Process Control Block, PCB)用 于描述和记录进 程的动态变化过程使进程能正确运行。 共享性一一同一程序同时运行于不同数据集合上时构成不同的 进程,或者说,多个不 同的进程可以共享相同的程序。所以, 程序和进程不是一一对应的。 动态性一一进程是程序在数据集合上的一次执行过程,是动态 概念,它有生命周期, 由创建而产生,由调度而执行,由撤销 而消亡。而程序是一组有序指令序列,是静态 概念,程序作为 一种系统资源是永久存在的。

java多线程专题知识讲座

java多线程专题知识讲座
线程旳Thread对象 public static void yield() ;使目前正在执行旳线程临时暂停,以
使其他旳线程运营 public final void wait(long timeout) throws InterruptedException;
目前线程被中断,并进入到一种对象旳等待列表中,直到另外旳 线程调用同一种对象上旳notify() 或notifyAll() 措施 public final void notify() ;用于将对象等待列表中旳任选旳一种 线程唤醒,使它再次成为可运营旳线程 public final void notifyAll();用于将对象等待列表中旳全部线程唤 醒,使它们再次成为可运营旳线程
9

这个类包括了创建和运营线程所需旳一切东西 构造函数:
public Thread(); public Thread(Runnable target); public Thread(String name);
参数阐明:
name:新线程对象旳名字
10
类 2-1
常用措施:
public void start();//开启该线程,将造成run措施被自动调用。 该措施将立即返回,新线程将运营
使用下述线措施取得或设置线程对象旳优先级 int getPriority(); void setPriority(int newPriority);
18
数据旳完整性
在大多数实际运营旳多线程应用程序中,两个或多种线程需要共 享对同一种对象旳访问。假如两个线程访问同一种对象,而且每 个线程都调用一种措施修改该对象旳状态,会出现什么情况?
2. 申明一种实现 Runnable 接口旳类,并实现 run() 措施。

第7章 多线程

第7章 多线程

第7章多线程一、选择题1.线程调用了sleep()方法后,该线程将进入()状态。

A.可运行状态B.运行状态C.阻塞状态D.终止状态2.关于java线程,下面说法错误的是()A.线程是以CPU为主体的行为B.java利用线程使整个系统成为异步C.创建线程的方法有两种:实现Runnable接口和继承Thread类D.新线程一旦被创建,它将自动开始运行3.在java中的线程模型包含()A.一个虚拟处理器B.CPU执行的代码C.代码操作的数据D.以上都是4.在java语言中,临界区可以是一个语句块,或者是一个方法,并用()关键字标识。

A.synchronizedB.includeC.importD.Thread5.线程控制方法中,yield()的作用是()A.返回当前线程的引用B.使比其低的优先级线程执行C.强行终止线程D.只让给同优先级线程运行6.线程同步中,对象的锁在()情况下持有线程返回A.当synchronized()语句块执行完后B.当在synchronized()语句块执行中出现例外(exception)时C.当持有锁的线程调用该对象的wait()方法时D.以上都是7.在以下()情况下,线程就进入可运行状态A.线程调用了sleep()方法时B.线程调用了join()方法时C.线程调用了yield()方法时D.以上都是8.java用()机制实现了进程之间的异步执行A.监视器B.虚拟机C.多个CPUD.异步调用9.下列程序实现简单的线程调度,请回答以下问题:Thread myThread=new MyThreadClass();myThread.start();try{myThread.sleep(10000);}catch(InterruptedExceptione){}myThread.stop();程序执行完第一行后,线程进入________状态;程序执行完第二行后,线程进入________状态;程序开始执行第五行时,线程进入________状态;程序执行完第五行后,线程进入________状态;程序执行完第十行后,线程进入________状态;A.新建状态B.可运行状态C.阻塞状态D.终止状态10.Thread类的方法中,toString()方法的作用是()A.只返回线程的名称B.返回当前线程所属的线程组的名称C.返回当前线程对象D.返回线程的名称11.运行下列程序,会产生什么结果?()1) public class Exercises3_1 extends Thread implements Runable {2) public void run() {3) System.out.println("this is run()");4) }5) public static void main(String args[]) {6) Thread t = new Thread(new Exercises3_1());7) t.start();8) }9) }A.第一行会产生编译错误B.第六行会产生编译错误C.第六行会产生运行错误D.程序会运行和启动12.线程在生命周期中要经历五种状态,若线程当前是新建状态,则它可以到达的下一个状态是()。

《Java高级课件-多线程篇》

《Java高级课件-多线程篇》

并发编程的问题和解决方案
深入了解并发编程中可能出现的问题和挑战,以及如何根据具体情况选择合适的解决方案。
线程安全问题
介绍常见的线程安全问题,如 竞态条件和死锁。
锁与同步机制
创新的解决方案
了解不同类型的锁和同步机制, 如synchronized和 ReentrantLock。
探讨一些创新的解决方案,如 无锁编程和函数式编程。
什么是线程安全
了解线程安全的概念和在程序设计中的重要 性。
常见的线程安全问题
介绍多线程环境中常见的线程安全问题,如 竞态条件和死锁。
线程同步的方法
介绍使用锁和同步关键字实现线程同步的方 法。
并发容器
介绍Java中的并发容器,如 ConcurrentHashMap和 CopyOnWriteArrayList。
了解如何根据实际需求调整线程池的大小和参数。
线程间通信的方法和技巧
探讨不同线程之间进行通信的各种方法和技巧,实现数据共享和协作。
1
共享内存
介绍使用共享内存进行线程间通信的
消息传递
2
方法。
了解使用消息传递进行线程间通信的方法。 Nhomakorabea3
进程间通信
探讨不同进程间通信的方法,如管道 和消息队列。
线程的调度和执行特性
《Java高级课件——多线 程篇》
欢迎来到《Java高级课件——多线程篇》!在这个课程中,我们将深入探讨 多线程编程的各个方面,包括线程的基本概念和原理,创建线程的方式和选 择,线程安全与线程同步,以及多线程在各种应用场景中的适用性。
概述多线程编程
学习和理解多线程编程的重要性,掌握多线程编程的基本概念和原理。
多线程的应用场景和适用性

Java第七章多线程机制全文-计算机

Java第七章多线程机制全文-计算机

■ MIN_PRIORITY : 值为 1· 当一个线程被创建时 , 他拥有创建它的线程的优 先级 。可使用以下方法改变线程的优先级:■ final void setPriority (int newp)■ final int getPriority ()· 当两个线程的优先级不同时 , JRE选择优先级高的运行。· 当两个线程优先级相同时 , JRE任意选择一个。
线程的同步机制· 当多个线程需要访问共同资源时 , 需要考现有0, 存入100, 余额100■ 示例 S 1 j
虑同步
ave
ave
:
:synchຫໍສະໝຸດ onized 方法声明 { 代码块;}
synchronized ( 对象名 ) { 代码块;}
· 两种使用方法:■ 锁定一段代码
关键字synchronized
■ 注意: 并且调用notify ()方法的线程应该已获得该对象的对象锁 。 · public final void notifyAll ()■ 唤醒与该对象相关的并且由于调用了wa it方法而进入了阻塞态的
■ 注意: 并且调用notifyAll()方法的线程应该已获得该对象的对象锁 。
· 存在问题: 线程间缺乏通信机制· 解决办法: 使用wait, notify, 和notifyAll法
线程间的通信( 1)Sender1.java……Sender put : 2
Sender put : 3Receiver get : 3
· 示例:· 输出:
一个线程 。所有线程 。· 示例: Sender2. java
■ 唤醒与该对象相关的并且由于调用了wa it方法而进入了阻塞态的
方法。· java既不能发现死锁 , 也不能避免死锁, 程序员应注意死锁问题 。 即 , 避免形成环

JavaCh7-多线程

JavaCh7-多线程

7.2.2 线程对象的生命周期

Thread类中
内部枚举类Thread.State表示线程状态
NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TREMINATED
判断线程状态的方法 改变线程状态的方法
7.2.2 线程对象的生命周期

Thread类中
编写实现Runnable接口的类,实现run()方法,
该类创建的实例称为目标对象
创建目标对象,再以目标对象为参数创建线 程对象 通过线程对象调用start()方法,开始新线程
ThreadDemo2.java
7.2.1 创建线程

两种方法的比较
第二种方式有以下好处
适合多个相同程序代码的线程去处理同一资源的情况 可以避免由于Java的单继承带来的局限性 有利于程序的健壮性,代码能够被多个线程共享,代码 与数据是独立的
7.2.2 线程对象的生命周期

线程对象生命周期实例 WelcomeJFrame.java
7.2.3 线程对象的优先级

Java提供10种优先级
1-10表示 1最低,10最高 默认值为5

相关方法
getPriority()获得线程优先级 setPriority() 修改线程优先级
NumberRunnable.java
7.2.2 线程对象的生命周期
NEW
start() run()结束
TERMI互斥锁 使用权
sleep()
synchronized()
TIMED_WAITING
notify() notifyAll()
wait()
BLOCKED
WAITING

[java入门学习]第 7 章 多 线 程

[java入门学习]第 7 章 多 线 程

第七章多线程7.1 多线程的概念多线程编程的含义是可将程序任务分成几个并行的子任务。

特别是在网络编程中,你会发现很多功能是可以并发执行的。

比如网络传输速度较慢,用户输入速度较慢,你可以用两个独立的线程去完成这个功能,而不影响正常的显示或其他功能。

多线程是与单线程比较而言的,普通的WINDOWS采用单线程程序结构,其工作原理是:主程序有一个消息循环,不断从消息队列中读入消息来决定下一步所要干的事情,一般是一个子函数,只有等这个子函数执行完返回后,主程序才能接收另外的消息来执行。

比如子函数功能是在读一个网络数据,或读一个文件,只有等读完这数据或文件才能接收下一个消息。

在执行这个子函数过程中你什么也不能干。

但往往读网络数据和等待用户输入有很多时间处于等待状态,多线程利用这个特点将任务分成多个并发任务后,就可以解决这个问题。

7.1.1 Java线程的模型Java的设计思想是建立在当前大多数操作系统都实现了线程调度。

Java虚拟机的很多任务都依赖线程调度,而且所有的类库都是为多线程设计的。

实时上,Java支持Macintosh 和Ms-dos 的平台; 所以迟迟未出来就是因为这两个平台都不支持多线程。

Java利用多线程实现了整个执行环境是异步的。

在Java程序里没有主消息循环。

如果一个线程等待读取网络数据,它可以运行但不停止系统的其他线程执行。

用于处理用户输入的线程大多时间是等待用户敲键盘或击鼠标。

还可以使动画的每一帧时间停顿一秒而并不使系统暂停。

一个线程启动后,它可以被挂起,暂时不让它执行。

挂起的线程可以重新恢复执行。

任何时间线程都可以被停止,被停止的线程就不能再重新启动。

Java语言里,线程表现为线程类,线程类封装了所有需要的线程操作控制。

必须很清晰地区分开线程对象和运行线程,你可以将线程对象看作是运行线程的控制面板。

在线程对象里有很多函数来控制一个线程是否运行,睡眠,挂起或停止。

线程类是控制线程行为的唯一的手段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

16
7.3 线程的挂起与唤醒
暂停线程的执行等待条件满足再执行. 暂停线程的执行等待条件满足再执行 下面的例子显示线程的挂起和唤醒 小应用程序第一次开始时,线程被启动 小应用程序第一次开始时 线程被启动 浏览器改变页面时,小应用程序的 小应用程序的stop()方法 浏览器改变页面时 小应用程序的 方法 被调用,线程被挂起 线程被挂起. 被调用 线程被挂起 浏览器回到原来的页面时,线程被唤醒 线程被唤醒. 浏览器回到原来的页面时 线程被唤醒
7
7.2 创建线程的方式
8
5. run方法是运行线程的主体 启动线程时 由 方法是运行线程的主体,启动线程时 方法是运行线程的主体 启动线程时,由 java直接调用 public void run() 直接调用 6.停止线程 由小应用程序的 停止线程,由小应用程序的 停止线程 由小应用程序的stop调用线程的 调用线程的 stop newthread.stop() 7 sleep方法的作用 暂停线程的执行 让其它线 方法的作用,暂停线程的执行 方法的作用 暂停线程的执行,让其它线 程得到机会,sleep要丢出异常 必须抓住. 程得到机会 要丢出异常,必须抓住 要丢出异常 必须抓住 Try{sleep(100)}catch(InterruptedException e){} 小应用程序中不用Runnable接口仍然可以 例:小应用程序中不用 小应用程序中不用 接口仍然可以 使用线程(不调用主类的方法和调用主类的方 使用线程 不调用主类的方法和调用主类的方 法)
7.4 多线程问题 如何写多线程来自多线程问题---如何写多线程1.分别定义不同的线程类,在各自的run方法中 1.分别定义不同的线程类,在各自的run方法中 分别定义不同的线程类 run 定义线程的工作 class mythread1 extends Thread { public void run{….} } class mythread2 extends Thread { public void run{….} } 2. 在主类中实例化各线程类 并启动线程 在主类中实例化各线程类,并启动线程 并启动线程. public class demo extends Applet { public void init() { mythread t1=new mythread1(); mythread t2=new mythread2(); t1.start(); t2.start();} }
7.2 创建线程的方式
public class Xyz implements Runnable { private boolean timeToQuit=false; ; public void run() () { while (! (!timeToQuit) ) {…..} //clean up before run() ends; () ; } public void stopRunning() { timeToQuit=true;} }
15
7.2 创建线程的方式
public class ControlThread { private Runnable r=new Xyz(); private Thread t=new Thread(r); public void startThread() { t.start(); } publi void stopThread() { r.stopRunning();} }
17
7.3 线程的挂起与唤醒
18
public void start() { if (mythread==null) {mythread=new Thread(); mythread.start();} else { mythread.resume();} } public void run() { while(true){ try{sleep(100);} catch(InterruptedException e) {}} } public void stop() { mythread.suspend(); }.
7.4 多线程问题 执行的顺序 多线程问题---执行的顺序
19
多个线程运行时,调度策略为固定优先级调 多个线程运行时 调度策略为固定优先级调 级别相同时,由操作系统按时间片来分配 度.级别相同时 由操作系统按时间片来分配 级别相同时 下面给出的例子中,共运行三个线程 共运行三个线程,它们做 下面给出的例子中 共运行三个线程 它们做 同样的事, 同样的事 每次打印循环次数和自己的序列 运行结果表明,它们并不是连续运行的 号,运行结果表明 它们并不是连续运行的 运行结果表明 它们并不是连续运行的. 在上例中如果给某个线程赋予较高的优先权, 在上例中如果给某个线程赋予较高的优先权 则发现这个进程垄断控制权 thread.setPriority(Thread.MAX_PRIORITY) thread\multithread.class--f1.bat thread\Priority.class---f2.bat
9
public class mainclass extends Applet 7.2 创建线程的方式 { 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){} }}
10
7.2 创建线程的方式
8.其它常用的方法 其它常用的方法 isAlive :判断线程目前是否正在执行状态中 判断线程目前是否正在执行状态中 if(newthread.isAlive()) newthread.stop(); resume:要求被暂停得线程继续执行 要求被暂停得线程继续执行 suspend:暂停线程的执行 暂停线程的执行 join:等待线程执行完毕 等待线程执行完毕 thatThread.join();被等待的那个线程不结束 当 被等待的那个线程不结束,当 被等待的那个线程不结束 前线程就一直等待. 前线程就一直等待 yield:将执行的权力交给其它线程 自己到队列 将执行的权力交给其它线程,自己到队列 将执行的权力交给其它线程 的最后等待. 的最后等待
//多个进程运行时执行顺序是交叉的 多个进程运行时执行顺序是交叉的 20 7.3 多线程问题 class multithread extends Thread { int threadNum; public static void main(String args[]) { multithread array[]=new multithread[3]; for (int i=0;i<3;i++) array[i]=new multithread(i); for (int i=0;i<3;i++) array[i].start(); } multithread(int SerialNum) { super(); threadNum=SerialNum; } public void run() { for(int j=0;j<5;j++) System.out.println("<"+j+"> +MySerialNum); System.out.println("thread "+threadNum+ "bye.");}}
6
7.2 创建线程的方式
1. public class mythread extends Applet implements Runnable (小应用或已经是某个类的子类时 小应用或已经是某个类的子类时) 小应用或已经是某个类的子类时 2. 继承类 继承类Thread public class mythread extends Thread 3. 上述两种方法中都可用类Thread产生线程的 上述两种方法中都可用类Thread产生线程的 对象 Thread newthread; 4. 创建并启动线程 newthread=new Thread(this); newthread.start();
第7章 多线程 章
北京大学计算机系 代亚非
第7章 多线程 章
7.1 多线程基本概念 7.2 创建线程的方式 7.3 线程的挂起与唤醒 7.4 多线程问题 7.5 小结
2
7.1 多线程基本概念
文件 各种系统资源 输入输出装置 文件 各种系统资源
3
输入输出装置
数据区段
数据区段
程序区段
程序区段
只有一个地方在执行
同时有数个地方在执行
传统的进程
多线程的任务
7.1 多线程基本概念
多线程的优势: 多线程的优势 减轻编写交互频繁,涉及面多的程序的困难. 减轻编写交互频繁,涉及面多的程序的困难 程序的吞吐量会得到改善. 程序的吞吐量会得到改善 由多个处理器的系统,可以并发运行不同的线 由多个处理器的系统 可以并发运行不同的线 否则,任何时刻只有一个线程在运行 程.(否则 任何时刻只有一个线程在运行 否则 任何时刻只有一个线程在运行)
4
7.1 多线程基本概念
线程与进程的区别: 线程与进程的区别 多个进程的内部数据和状态都是完全独立的, 多个进程的内部数据和状态都是完全独立的 而多线程是共享一块内存空间和一组系统资 有可能互相影响. 源,有可能互相影响 有可能互相影响 线程本身的数据通常只有寄存器数据,以及 线程本身的数据通常只有寄存器数据, 一个程序执行时使用的堆栈, 一个程序执行时使用的堆栈,所以线程的切 换比进程切换的负担要小. 换比进程切换的负担要小.
相关文档
最新文档