Java第09章--1(多线程)
- 格式:pdf
- 大小:200.38 KB
- 文档页数:34
2、创建线程的方式
Thread类的方法 void run()
线程所执行的代码
void start() throws IllegalThreadStateException
使程序开始执行,多次调用会产生例外
void sleep(long millis)
让线程睡眠一段时间,此期间线程不消耗CPU资源
void interrupt()
join(int time): 最多等待time所 指定的时间。
3、线程的生命周期及控制
sleep()方法可以暂停线程的执行,让其它线程得到机会。 但sleep()要丢出例外InterruptedException ,必须抓住。
try { sleep(100); }catch(InterruptedException e){ // 如果没有到sleep timeout …//本例外可不作处理 }
2、创建线程的方式
Thread类的方法 void destroy()
销毁线程
void stop()
终止线程的执行(deprecated)
void suspend() / void resume()
挂起线程 / 重启线程(deprecated)
static void yield()
暂停当前线程,让其他线程执行
例7.5, P485: ThreadTest.java
2、创建线程的方式
方法二:
提供一个实现接口Runnable的类作为线程的目标对象。 在初始化一个Thread类或子类生成线程实例时,把目标对象 传递给这个线程实例,由该目标对象提供线程体run()方法。 通过实现接口Runnable的类还可以再继承其他类,因此 利用Runnable接口可以实现一个多继承机制。
1、多线程基本概念
多线程的优势:
多线程编程简单,效率高(能直接共享数据和资源,多进程不能) 适合于开发服务程序(如Web服务,聊天服务等) 适合于开发有多种交互接口的程序(如聊天程序的客户端,网络下
载工具)
适合于有人机交互又有计算量的程序(如字处理程序Word/Excel)
减轻编写交互频繁、涉及面多的程序的困难(如监听网络端口) 程序的吞吐量会得到改善(同时监听多种设备,如网络端口、串口、并口以
线程到可运行线程队列(ready)的最后等待,若队列空,该方法无效。
myThread thd = new MyThread(); thd.start(); … thd.join(); //等待线程thd执行完后再继续往下执行 … // 如果在main函数中没有join,会有什么后果 // 在JDK1.0.2中必须有,后来的版本可以取消
2、创建线程的方式
Java的线程是通过Java的软件包ng中 定义的类Thread来实现的。当生成一个Thread类 的对象之后,就产生了一个线程,通过该对象 实例,可以启动线程、终止线程、或者暂时挂 起线程等。
2、创建线程的方式
Thread类本身只是线程的虚拟CPU; 线程所执行的代码(或者说线程所要完成的功能)是通过 方法run( )(包含在一个特定的对象中)来完成的,方法run( ) 称为线程体。实现线程体的特定对象是在初始化线程时传递 给线程的。 在一个线程被建立并初始化以后,Java的运行时系统就自 动调用run( )方法,正是通过run( )方法才使得建立线程的目的 得以实现。 通常,run( )方法是一个循环,例如一个播放动画的线程要 循环显示一系列图片。有时,run( )方法会执行一个时间较长 的操作,例如下载并播放一个MPEG格式的电影。
group指明了线程所属的线程组; target是线程体run()方法所在的对象; name是线程的名称。
target必须实现接口Runnable。在接口Runnable中只定义了 一个方法void run()作为线程体。任何实现接口Runnable的对象 都可以作为一个线程的目标对象。 类Thread本身也实现了接口Runnable(空实现),因此, 上述构造方法中各参数都可以为null。
suspend()方法和resume()可以用来暂停线程或恢复线程。 可以由线程自身在线程体中调用suspend()方法暂停自己,也 可以在其他线程中通过线程实例调用suspend()方法暂停线程 的执行。但是要恢复由suspend()方法暂停的线程,只能在其 他线程中通过线程实例调用resume()方法。 MethodTest.java Applet的生命周期举例:Clock.java
3、线程的生命周期及控制
isAlive()方法:可以用来判断线程目前是否正在执行中。如果线程
已被启动并且未被终止,那么isAlive( )返回true,但该线程是可运行或是 不可运行的,是不能作进一步的分辨。如果返回false,则该线程是新创 建或是已被终止的(同样不能作进一步的分辨)。
join()方法:等待线程执行完毕。 yield()方法:将执行的权力交给其它优先级相同的线程,当前执行
ready new Thread() running start() New Thread stop()
yield() . . Runnable
Block resume()
stop()
run()exit
Dead
stop()
notify()/notifyAll() sleep timeout
I/O结束
Runnable run1= new ThreadTester("Therad1");
Байду номын сангаас
创建Thread类的对象,用Runnable对象作为构造函数的参 数,并用start方法启动线程。 Thread(run1).start();
3、线程的生命周期及控制
线程是程序内部的一个顺序控制流,它具有一个特定的生命周 期。在一个线程的生命周期中,它总处于某一种状态中。 suspend() sleep() wait() I/O流阻塞 . waiting sleeping suspending
1、多线程基本概念
从逻辑的观点来看,多线程意味着一个程序的多行语句同时 执行,但是多线程并不等于多次启动一个程序,操作系统也不 会把每个线程当作独立的进程来对待: 两者的粒度不同,是两个不同层次上的概念。进程是由操 作系统来管理的,而线程则是在一个程序(进程)内。 不同进程的代码、内部数据和状态都是完全独立的,而一 个程序内的多线程是共享同一块内存空间和同一组系统资 源,有可能互相影响。 线程本身的数据通常只有寄存器数据,以及一个程序执行 时使用的堆栈,所以线程的切换比进程切换的负担要小。
4、线程的优先级及调度
在Java中:线程的优先级是用数字来表示的,分为三个级别: 低优先级:Thread.MIN_PRIORITY,数值为1 (2~4) 缺省优先级: Thread. NORM_PRIORITY,数值为5 高优先级:Thread.MAX_PRIORITY,数值为10 (6~9) 具有相同优先级的多个线程,若它们都为高优先级 Thread.MAX_PRIORITY,则每个线程都是独占式的,也就是 说这些线程将被顺序执行;若该优先级不为高优先级,则这些 线程将同时执行,也就是说这些线程的执行是无序的。 线 程 被 创 建 后 , 其 缺 省 的 优 先 级 是 缺 省 优 先 级 Thread. NORM_PRIORITY。可以用方法 int getPriority()来获得线程的 优先级,同时也可以用方法 void setPriority( int p ) 在线程被创 建后改变线程的优先级。 TwoThreadsTest.java
final void setPriority(int p)
设定线程的优先级
final void notify() / notifyAll() / wait(long timeout) - 从 Object继承而来,唤醒/等待被唤醒
2、创建线程的方式
从Thread类的构造方法可以看出,用户可以有两种方法构 造自己的run( )方法。
方法一:
定义一个线程类,它继承类Thread并重写其中的方法 run()。这时在初始化这个类的实例时,目标对象target可以 为null,表示这个实例本身具有线程体。 由于通过扩展Thread类获得的子类,只能继承Thread类 的功能,因此,这是一种单继承机制。用这种方法定义的类 不能再继承其他类,即不能获得其它类的功能。
static Thread currentThread()
返回当前线程对象的引用
void setName(String threadName)
改变线程的名字
String getName()
获得线程的名字
void join([long millis[, int nanos]])
等待线程结束,mills+nanos
及其他外设)
有多个处理器的系统,可以并发运行不同的线程(否则,任何时刻只有一
个线程在运行)
1、多线程基本概念
虽然各种操作系统(Unix/Linux、Windows系列等)都支持 多线程,但若要用C、C++或其他语言编写多线程程序是十分 困难的,因为它们对数据同步的支持不充分。 对多线程的综合支持是Java语言的一个重要特色,它提供 了Thread类来实现多线程。在Java中,线程可以认为是由三部 分组成的: 虚拟CPU,封装在ng.Thread类中,它控制着整个线 程的运行; 执行的代码,传递给Thread类,由Thread类控制顺序执 行; 处理的数据,传递给Thread类,是在代码执行过程中所 要处理的数据。
4、线程的优先级及调度
Java提供一个线程调度器来监控程序中启动后进入可运 行状态的所有线程。 线程调度器按照线程的优先级决定调度哪些线程来执 行,具有高优先级的线程会在较低优先级的线程之前得到执 行。同时线程的调度是抢先式的,即如果当前线程在执行过 程中,一个具有更高优先级的线程进入可执行状态,则该告 优先级的线程会被立即调度执行。 多个线程运行时,若线程的优先级相同,由操作系统按 时间片轮转方式或独占方式来分配线程的执行时间。