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