线程 JAVA 教程PPt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
static int MAX_PRIORITY static int MIN_PRIORITY static int NORM_PRIORITY
线程的优先级及调度管理
线程的调度策略
线程调度器选择优先级最高的线程运行。但 是,如果发生以下情况,就会终止线程的运 行。
线程体中调用了yield()方法,让出了对CPU的占用 权 线程体中调用了sleep()方法, 使线程进入睡眠状 态 线程由于I/O操作而受阻塞 另一个更高优先级的线程出现。 在支持时间片的系统中,该线程的时间片用完。
Thread类的子类来创建线程
class MyThread1 extends Thread { public MyThread1(String str){ super(str); } public void run(){ ........ } } class Caller() { public static void main(String[] args) { new MyThread("May 1st").start(); } }
线程同步Synchronized
synchronized关键字可以作为函数的修饰符, 也可作为函数内的语句,也就是平时说的 同步方法和同步语句块。 无论synchronized关键字加在方法上还是对 象上,它取得的锁都是对象,而不是把一 段代码或函数当作锁――而且同步方法很 可能还会被其他线程的对象访问。
线程的常用方法
interrupt()
经常用来“吵醒”休眠的线程。 例题8-8
getName()
返回该线程的名称。
setName(String name)
改变线程名称,使之与参数 name 相同。
isAlive()
测试线程是否处于活动状态。
currentThread()
返回当前正在使用CPU资源的线程
例题8-3
用Runnable接口来创建线程
定义线程类实现Runnable接口 Thread myThread = new Thread(target); //target为Runnable接口类型 Runnable中有一个方法:public void run();用以定 义线程运行体 使用Runnable接口可以为多个线程提供共享的 数据 在实现Runnable接口的类的run()方法定义中可 以使用Thread的静态方法public static Thread currentThread();获取当前线程的引用
两种实现方式的区别和联系:
在程序开发中只要是多线程以实现 Runnable接口为主,因为实现Runnable接 口相比继承Thread类有如下好处:
避免点继承的局限,一个类可以实现多个接口。 适合于资源的共享。
Runnable接口和Thread之间的联系:
public class Thread extends Object implements Runnable
线程的概念
进程与线程
每个进程都有一段专用的内存区域 线程可共享相同的内存单元(包括代码和数据)
多进程:在操作系统中能同时运行多个任 务(程序); 多线程:在同一个应用程序中有多个顺序流 同时执行 多线程的目的是为了最大限度的利用CPU 资源。
Java的线程
Java应用程序总是从主类的main方法开始执行。 当JVM加载代码,发现main方法之后,就会启动 一个线程,这个线程称作“主线程”,该线程负 责执行main方法。那么,在main方法中再创建的 线程,就称为主线程中的线程。 每个线程都是通过某个特定Thread对象所对应的 方法run()来完成其操作的,方法run()称为线程体, 通过调用Thread类的start()方法来启动一个线程。
public ThreadTest implements Runnable{ public synchronized void run(){ for(int i=0;i<10;i++) { System.out.println(" " + i); } } public static void main(String[] args) { ThreadTest r1 = new ThreadTest(); ThreadTest r2 = new ThreadTest(); Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); // Thread t2 = new Thread(r1); t1.start(); t2.start(); } }
线程的常用方法
sleep(int millsecond)
sleep()可以使低优先级的线程得到执行的机会,当然 也可以让同优先级、高优先级的线程有执行的机会。 并不释放对象锁。也就是如果有Synchronized同步块, 其他线程仍然不同访问共享数据。注意该方法要捕获 异常
yield()
与sleep()类似,只是不能由用户指定暂停多长时间, 并且yield()方法只能让同优先级的线程有执行的机会。
线程的常用方法
join()
使调用该方法的线程在此之前执行完毕,也就 是等待调用该方法的线程执行完毕后再往下继 续执行。注意该方法也要捕获异常。 在一定意义上,它可以实现同步的功能。
例joinTest.java 例8-13
classThread下的常用函数
suspend()、resume()
通过suspend()函数,可使线程进入停滞状态。 通过suspend()使线程进入停滞状态后,除非收 到resume()消息,否则该线程不会变回可执行 状态。 当调用suspend()函数后,线程不会释放它的 “锁标志”。
Interrupt()
图11.1 线程的生命周期与线程的状态
例8-1 例8-2
线程的优先级及调度管理
优先级:在多线程系统中,每个线程都被赋予一 个执行优先级。优先级决定了线程被CPU执行的优 先顺序。 线程的优先级设置遵从以下原则
线程创建时,子进程继承父进程的优先级 线程创建后,可通过调用setPriority()方法改变优 先级。 Java线程的优先级:取值范围是1~10
用Runnable接口来创建线程
class TestThread2 implements Runnable { public void run(){ ........ } } class Caller(){ public static void main(String[] args){ MyThread2 test = new MyThread2(); new Thread(test).start();// } }
Java的线程
JVM在主线程和其他线程之间轮流切换, 保证每个线程都有机会使用CPU资源, main方法即使执行完最后的语句,JVM也 不会结束我们的程序,JVM一直要等到主 线程中的所有线程都结束之后,才结束我 们的Java应用程序。
线程的生命周期
新建线程在它的一个完整的生命周期内通 常要经历四种状态。通过线程的控制与调 度可使线程在这几种状态间转化: 新建状态 运行状态 中断状态 死亡状态
线程
线程的基本概念 线程的创建和启动 线程的常用方法 线程的同步机制
Synchronized wait()、notify()、notifyAll() 、 、
线程的概念
程序、进程、线程
程序:(Program)是一段静态的代码,它是应用 软件执行的蓝本。 进程(Process)是程序的一次执行过程,是系统 运行程序的基本单位。 线程(Thread) 是比进程更小的执行单位。相当 于一个任务中的一条执行路径。
例ThreadTicket.java与RunnableTicket.java
Runnable接口与目标对象
使用同一目标对象的线程共享目标对象的 成员变量
例8-4 例8-5
关于run方法中的局部变量
不同线程的run方法中的局部变量互不干扰, 一个线程改变了自己的run方法中局部变量 的值不会影响其他线程的run方法中的局部 变量。
线程的创建和启动
Java中实现多线程的方法有两种,一种是 继承ng包中的Thread类,二是用户 在定义自己的类中实现Runnable接口。
Thread类的子类来创建线程
定义一个Thread的子类并重写其run方法如: class MyThread extends Thread { public void run() {...} } 生成该类的对象: MyThread myThread = new MyThread();
例MyTest.java
线程同步Synchronized
由于同一进程的多个线程共享同一片存储空间, 在带来方便的同时,也带来了访问冲突这个严重 的问题。Java语言提供了专门机制以解决这种冲 突,有效避免了同一个数据对象被多个线程同时 访问。 每个对象都有一个锁标志,当一个线程访问该对 象时,被Synchronized修饰的数据将被“上锁”, 阻止其他线程访问。当前线程访问完这部分数据 后释放锁标志,其他线程就可以访问了。
synchronized关键字同步方法
synchronized关键字同步静态方法: synchronized static StaticMethod{…} 作用域:某个类的范围,防止多个线程同 时访问这个类中的synchronized static 方法。 它可以对类的所有对象实例起作用。
注意
synchronized关键字不能继承。 在定义接口方法时不能使用synchronized关键字。 构造方法不能使用synchronized关键字 (synchronized块来进行同步)。 Synchronized的位置
线程同步Synchronized
每个对象只有一个锁(lock)与之相关联 实现同步是要很大的系统开销作为代价的, 甚至可能造成死锁,所以尽量避免无谓的 同步控制。
synchronized关键字同步方法
synchronized关键字同步实例方法: public synchronized void method(){…} 作用域:某个对象实例内,可以防止多个 线程同时访问这个对象的synchronized方法 (如果一个对象有多个synchronized方法, 只要一个线程访问了其中的一个 synchronized方法,其它线程不能同时访问 这个对象中任何一个synchronized方法)。 注意,不同的对象实例的 synchronized方 法是不相干扰的。例8-9
不能放在方法返回类型的后面 在非静态方法中,synchronized还可以放在方法定义的最 前面,在静态方法中,synchronized可以放在static的前 面
注意
synchronized关键字只能用来同步方法,不 能用来同步类变量
public synchronized void method(); synchronized public void method(); public static synchronized void method(); public synchronized static void method(); synchronized public static void method(); public void synchronized method(); public static void synchronized method(); public synchronized int n =0; public static synchronized int n = 0;
线程的状态与生命周期
新建状态 Newborn start() 就绪状态 Runnable 时间片到 yield() sleep时间到 interrupt() 获得互斥 使用权 其它阻塞 Blocked 互斥阻塞 Blocked sleep() join() wait() synchronized() notify() 等待阻塞 Blocked 调度 运行状态 Running run()结束 消亡状态 Dead
例8-6
线程的常用方法
start()
线程调用该方法将启动线程,使之从新建状态 进入就绪队列排队。
run()
Thread类的run()方法与Runnable接口中的run() 方法的功能和作用相同,都用来定义线程对象 被调度之后所执行的操作,都是系统自动调用 而用户程序不得引用的方法。
getPriority()/setPriority()
线程的优先级及调度管理
线程的调度策略
线程调度器选择优先级最高的线程运行。但 是,如果发生以下情况,就会终止线程的运 行。
线程体中调用了yield()方法,让出了对CPU的占用 权 线程体中调用了sleep()方法, 使线程进入睡眠状 态 线程由于I/O操作而受阻塞 另一个更高优先级的线程出现。 在支持时间片的系统中,该线程的时间片用完。
Thread类的子类来创建线程
class MyThread1 extends Thread { public MyThread1(String str){ super(str); } public void run(){ ........ } } class Caller() { public static void main(String[] args) { new MyThread("May 1st").start(); } }
线程同步Synchronized
synchronized关键字可以作为函数的修饰符, 也可作为函数内的语句,也就是平时说的 同步方法和同步语句块。 无论synchronized关键字加在方法上还是对 象上,它取得的锁都是对象,而不是把一 段代码或函数当作锁――而且同步方法很 可能还会被其他线程的对象访问。
线程的常用方法
interrupt()
经常用来“吵醒”休眠的线程。 例题8-8
getName()
返回该线程的名称。
setName(String name)
改变线程名称,使之与参数 name 相同。
isAlive()
测试线程是否处于活动状态。
currentThread()
返回当前正在使用CPU资源的线程
例题8-3
用Runnable接口来创建线程
定义线程类实现Runnable接口 Thread myThread = new Thread(target); //target为Runnable接口类型 Runnable中有一个方法:public void run();用以定 义线程运行体 使用Runnable接口可以为多个线程提供共享的 数据 在实现Runnable接口的类的run()方法定义中可 以使用Thread的静态方法public static Thread currentThread();获取当前线程的引用
两种实现方式的区别和联系:
在程序开发中只要是多线程以实现 Runnable接口为主,因为实现Runnable接 口相比继承Thread类有如下好处:
避免点继承的局限,一个类可以实现多个接口。 适合于资源的共享。
Runnable接口和Thread之间的联系:
public class Thread extends Object implements Runnable
线程的概念
进程与线程
每个进程都有一段专用的内存区域 线程可共享相同的内存单元(包括代码和数据)
多进程:在操作系统中能同时运行多个任 务(程序); 多线程:在同一个应用程序中有多个顺序流 同时执行 多线程的目的是为了最大限度的利用CPU 资源。
Java的线程
Java应用程序总是从主类的main方法开始执行。 当JVM加载代码,发现main方法之后,就会启动 一个线程,这个线程称作“主线程”,该线程负 责执行main方法。那么,在main方法中再创建的 线程,就称为主线程中的线程。 每个线程都是通过某个特定Thread对象所对应的 方法run()来完成其操作的,方法run()称为线程体, 通过调用Thread类的start()方法来启动一个线程。
public ThreadTest implements Runnable{ public synchronized void run(){ for(int i=0;i<10;i++) { System.out.println(" " + i); } } public static void main(String[] args) { ThreadTest r1 = new ThreadTest(); ThreadTest r2 = new ThreadTest(); Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); // Thread t2 = new Thread(r1); t1.start(); t2.start(); } }
线程的常用方法
sleep(int millsecond)
sleep()可以使低优先级的线程得到执行的机会,当然 也可以让同优先级、高优先级的线程有执行的机会。 并不释放对象锁。也就是如果有Synchronized同步块, 其他线程仍然不同访问共享数据。注意该方法要捕获 异常
yield()
与sleep()类似,只是不能由用户指定暂停多长时间, 并且yield()方法只能让同优先级的线程有执行的机会。
线程的常用方法
join()
使调用该方法的线程在此之前执行完毕,也就 是等待调用该方法的线程执行完毕后再往下继 续执行。注意该方法也要捕获异常。 在一定意义上,它可以实现同步的功能。
例joinTest.java 例8-13
classThread下的常用函数
suspend()、resume()
通过suspend()函数,可使线程进入停滞状态。 通过suspend()使线程进入停滞状态后,除非收 到resume()消息,否则该线程不会变回可执行 状态。 当调用suspend()函数后,线程不会释放它的 “锁标志”。
Interrupt()
图11.1 线程的生命周期与线程的状态
例8-1 例8-2
线程的优先级及调度管理
优先级:在多线程系统中,每个线程都被赋予一 个执行优先级。优先级决定了线程被CPU执行的优 先顺序。 线程的优先级设置遵从以下原则
线程创建时,子进程继承父进程的优先级 线程创建后,可通过调用setPriority()方法改变优 先级。 Java线程的优先级:取值范围是1~10
用Runnable接口来创建线程
class TestThread2 implements Runnable { public void run(){ ........ } } class Caller(){ public static void main(String[] args){ MyThread2 test = new MyThread2(); new Thread(test).start();// } }
Java的线程
JVM在主线程和其他线程之间轮流切换, 保证每个线程都有机会使用CPU资源, main方法即使执行完最后的语句,JVM也 不会结束我们的程序,JVM一直要等到主 线程中的所有线程都结束之后,才结束我 们的Java应用程序。
线程的生命周期
新建线程在它的一个完整的生命周期内通 常要经历四种状态。通过线程的控制与调 度可使线程在这几种状态间转化: 新建状态 运行状态 中断状态 死亡状态
线程
线程的基本概念 线程的创建和启动 线程的常用方法 线程的同步机制
Synchronized wait()、notify()、notifyAll() 、 、
线程的概念
程序、进程、线程
程序:(Program)是一段静态的代码,它是应用 软件执行的蓝本。 进程(Process)是程序的一次执行过程,是系统 运行程序的基本单位。 线程(Thread) 是比进程更小的执行单位。相当 于一个任务中的一条执行路径。
例ThreadTicket.java与RunnableTicket.java
Runnable接口与目标对象
使用同一目标对象的线程共享目标对象的 成员变量
例8-4 例8-5
关于run方法中的局部变量
不同线程的run方法中的局部变量互不干扰, 一个线程改变了自己的run方法中局部变量 的值不会影响其他线程的run方法中的局部 变量。
线程的创建和启动
Java中实现多线程的方法有两种,一种是 继承ng包中的Thread类,二是用户 在定义自己的类中实现Runnable接口。
Thread类的子类来创建线程
定义一个Thread的子类并重写其run方法如: class MyThread extends Thread { public void run() {...} } 生成该类的对象: MyThread myThread = new MyThread();
例MyTest.java
线程同步Synchronized
由于同一进程的多个线程共享同一片存储空间, 在带来方便的同时,也带来了访问冲突这个严重 的问题。Java语言提供了专门机制以解决这种冲 突,有效避免了同一个数据对象被多个线程同时 访问。 每个对象都有一个锁标志,当一个线程访问该对 象时,被Synchronized修饰的数据将被“上锁”, 阻止其他线程访问。当前线程访问完这部分数据 后释放锁标志,其他线程就可以访问了。
synchronized关键字同步方法
synchronized关键字同步静态方法: synchronized static StaticMethod{…} 作用域:某个类的范围,防止多个线程同 时访问这个类中的synchronized static 方法。 它可以对类的所有对象实例起作用。
注意
synchronized关键字不能继承。 在定义接口方法时不能使用synchronized关键字。 构造方法不能使用synchronized关键字 (synchronized块来进行同步)。 Synchronized的位置
线程同步Synchronized
每个对象只有一个锁(lock)与之相关联 实现同步是要很大的系统开销作为代价的, 甚至可能造成死锁,所以尽量避免无谓的 同步控制。
synchronized关键字同步方法
synchronized关键字同步实例方法: public synchronized void method(){…} 作用域:某个对象实例内,可以防止多个 线程同时访问这个对象的synchronized方法 (如果一个对象有多个synchronized方法, 只要一个线程访问了其中的一个 synchronized方法,其它线程不能同时访问 这个对象中任何一个synchronized方法)。 注意,不同的对象实例的 synchronized方 法是不相干扰的。例8-9
不能放在方法返回类型的后面 在非静态方法中,synchronized还可以放在方法定义的最 前面,在静态方法中,synchronized可以放在static的前 面
注意
synchronized关键字只能用来同步方法,不 能用来同步类变量
public synchronized void method(); synchronized public void method(); public static synchronized void method(); public synchronized static void method(); synchronized public static void method(); public void synchronized method(); public static void synchronized method(); public synchronized int n =0; public static synchronized int n = 0;
线程的状态与生命周期
新建状态 Newborn start() 就绪状态 Runnable 时间片到 yield() sleep时间到 interrupt() 获得互斥 使用权 其它阻塞 Blocked 互斥阻塞 Blocked sleep() join() wait() synchronized() notify() 等待阻塞 Blocked 调度 运行状态 Running run()结束 消亡状态 Dead
例8-6
线程的常用方法
start()
线程调用该方法将启动线程,使之从新建状态 进入就绪队列排队。
run()
Thread类的run()方法与Runnable接口中的run() 方法的功能和作用相同,都用来定义线程对象 被调度之后所执行的操作,都是系统自动调用 而用户程序不得引用的方法。
getPriority()/setPriority()