J10_线程
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
线程对象.start();
– 然后由系统自动调用run()方法. – 用继承Thread类的子类创建线程对象比较简单: new 继承Thread类的子类(); – 实现Runnable接口的类创建线程对象比较复杂: new Thread(new 实现 实现Runnable接口的类 接口的类()); 接口的类
Java (SSXDU 2007)
线程
这是因为, Windows操作系统在负责对CPU等资源进 行分配和管理,虽然CPU在某一时刻只能做一件事, 但它的工作速度极快,在Windows操作系统管理下, 以非常小的的时间间隔交替执行多个程序,宏观上给 人已同时执行多个程序的感觉. 同学在网上聊天时都有这样的体会:假如你是一个快 手,你可以同时打开多个QQ窗口,与多个慢手聊天. 对于每个慢手来说,快手仅仅与自己聊天. CPU的运算速度极快,相当于快手,在Windows操作 系统管理下,可以同时支持多个程序运行.(正在运 行的多个程序相当于慢手)
Java (SSXDU 2007)
线程
1.
创建一个继承Thread类的子类,这个子类必须重写父类 Thread类中的run方法,在run方法中写入需要在新线 程中执行的语句段. run方法中的内容实际就是另一个 线程要执行的全部内容.简称线程体. 创建另一个类,该类中提供main方法.main方法运行 时,称为main线程,在main线程中创建Thread类的子 类的对象,这样就产生一个新的线程对象.然后调用新 的线程对象的start方法,新的线程将自动进入run方 法.在Java虚拟机管理下,主线程和新的线程同时运行, 一直到各个线程运行结束为止,整个程序才结束. 新的线程对象的产生和运行必须在main线程中进行,只 有main线程运行后,才能运行其它新的线程对象.整个 Java程序运行结束必须是各个线程运行结束为止.
Java (SSXDU 2007)
线程的同步
关于在同步方法中使用wait()方法和notifyAll()方 法. 上述的例题中,某个线程对象在run()方法中对同步 方法进行调用时,其它线程对象都不能得到执行. 有时希望其它线程对象也能得到执行,必须让正在执 行的线程调用wait()方法,这时该线程处于等待状态. 其它线程可以得到执行,其它线程执行结束后,调用 notifyAll()方法,使得处于等待状态的线程恢复执 行. Example3.java
Java (SSXDU 2007)
线程的同步
怎样才能实现呢?
– 用户在实现Runnable接口的类中编写一个同步方法, 对共享目标对象的money属性进行修改.然后在 run()方法中对这个同步方法进行调用.当其中一个 线程对象要对共享目标对象的money属性进行修改时, 其它线程对象都不能得到执行. – Synchronized关键字
Wait 和 Notify: Code
Producer:
produceResource(); synchronized (lock) { lock.notifyAll(); }
Java (SSXDU 2007)
Βιβλιοθήκη Baidu
Wait/Notify顺序 Wait/Notify顺序
Lock Object
1. synchronized(lock){ 2. lock.wait(); 9. consumeResource(); 10. }
Java (SSXDU 2007)
线程:例
Example.java Bank bank = new Bank();
– 当创建Bank类对象 bank时,还同时创建了属于该 对象的两个线程对象. – Bank类对象 bank称为这两个线程对象的目标对象. 两个线程对象共享目标对象的money属性(全局内存 变量).但是,每个线程对象都独自享有自己的 run()方法.
该线程对象.让main线程和另一线程同时运行.
Java (SSXDU 2007)
线程
创建一个实现Runnable接口的类,这个类必须重写 Runnable接口中的run方法,在run方法中写入需要 在新线程中执行的语句段. run方法中的内容实际就是 另一个线程要执行的全部内容.简称线程体. 创建另一个类,该类中提供main方法.main方法中, main main 创建实现Runnable接口的类的对象.由于该对象并不 创建实现 接口的类的对象.由于该对象并不 是线程对象,所以必须调用系统提供的线程类Thread 的另一个构造方法: Thread(Runnable target) 来创建线程对象,然后再调用该对象的start()方法, 启动该线程对象.新的线程将自动进入run方法.在 Java虚拟机管理下,主线程和新的线程同时运行,一直 到各个线程运行结束为止,整个程序才结束.
– 下面Java程序有两个类,其中是一个继承Thread类的子类, 另一个类仅仅含有main方法的类.在main方法中创建Thread 类的子类对象,并调用该对象的start()方法,启动该线程对 象.让main线程和另一线程同时运行. – 多线程程序: MultiThread.java – 创建一个继承Thread类的子类FactorialThread,这个子类 必须重写父类Thread类中的run方法,在run方法中写入需要 在新线程对象执行的语句段. run方法中的内容实际就是另一 个线程要执行的全部内容.简称线程体.
2.
3.
Java (SSXDU 2007)
线程
在Java程序中创建多线程操作,还可以通过实 现Runnable接口的类来进行. Runnable接口 也是Java多线程机制的一个重要部分,实际上 它只有一个run()方法.
– 编写复杂程序时,相关的类可能已经继承了某个基类, 而Java不支持多继承,在这种情况下,便需要通过 Java 实现Runnable接口生成多线程程序. 实现 接口生成多线程程序. – 可以在main()方法中创建实现Runnable接口类的 对象,该对象并不是线程对象,但是可以调用系统提 供的线程类Thread的另一个构造方法: 供的线程类 Thread(Runnable target) 创建线程对象,然后再调用该对象的start()方法,启动
Java (SSXDU 2007)
线程
一个Java应用程序的一次执行对应于一个进程. 每个进程至少有一个线程在工作.到目前为止, 我们开发的程序都是单线程程序.单线程程序 运行时,既可以把它看成是进程,也可以把它 看成是线程. Java语言允许一个应用程序含有 多个线程. 何谓线程?
– 一个Java应用程序中有多段代码同时并发执行,其 中的每一段正在并发执行的代码,就是一个线程. – 如果用户开发的应用程序含有多个线程,那么该应用 程序执行时,多个线程将同时并发执行,运行效果同 多进程同时执行.不过,多进程管理是在操作系统管 理之下进行,而多线程是在用户开发的应用程序管理 下进行.
并 发 (多线程)
第21章
霍秋艳 qyhuo@mail.xidian.edu.cn
Java (SSXDU 2007)
线程
何谓进程? 一个独立程序的每一次运行称为进程. 例如:启动一个文字处理软件编辑文稿,正在运行的 文字处理软件就是一个进程.又如,打开mp3播放程序 听音乐,正在运行的mp3播放程序也是一个进程. Windows操作系统还支持多进程操作. 例如:用户可以在使用文字处理软件一边编辑文稿时, 同时也可以打开mp3播放程序一边听音乐. 我们知道,个人计算机只有一个CPU,任何程序运行 离不开CPU 的支持.某一时刻,CPU只能干一件事. 为什么人们会感觉多个程序同时运行呢?(就算是双核, 多于2件)
Java (SSXDU 2007)
Wait 和 Notify
允许两个线程基于一个共享锁协作 关于生产者和消费者的问题.
ProducerConsumerTest.java
两个线程对象Producer和Consumer共享 目标对象的seq属性(全局内存变量). 希望线程对象Producer每修改一次seq属 性的值,线程对象Consumer仅仅能得到一次线 程对象Producer修改后的seq属性的值.
Java (SSXDU 2007)
Wait 和 Notify: Code
Consumer:
synchronized (lock) { while (!resourceAvailable()) { lock.wait(); } consumeResource(); }
Java (SSXDU 2007)
Java (SSXDU 2007)
关于run()方法中的局部变量 关于run()方法中的局部变量
实现Runnable接口的类可以创建若干个线程对 象,属于同一个目标对象的若干个线程对象可 以共享目标对象的属性.但是,若run()方法 提供了局部变量,每个线程对象都独自享有自 己的run()方法和局部变量. 例:Example1.java
例:Example2.java
Java (SSXDU 2007)
线程的同步
例:Example3.java Bank a = new Bank(); 当创建Bank类对象a 时,还同时创建了属于该 对象的两个线程对象. Bank类对象 a 称为这两个线程对象的目标对象. 两个线程对象共享目标对象a的money属性.但 是,每个线程对象都独自享有自己的run()方 法. 其中一个线程对象要对共享目标对象的money 属性进行修改,而且修改过程要分三次进行. 每修改一次,都要停下来喝口水,用 sleep(1000)模拟实现.希望喝水期间,不让 其它线程执行.
Java (SSXDU 2007)
interrupt()方法的使用 interrupt()方法的使用
关于interrupt()方法的使用
– 某个正在运行的线程对象可以使用interrupt()方 法来"吵醒"正在处于休眠的线程对象. – 下面例题有三个线程,其中两个线程准备打算休眠 10秒钟,可是另一个线程运行后2.5秒后,把正在处 于休眠的两个线程对象"吵醒".
Java (SSXDU 2007)
单线程程序
MainThread.java 单线程程序运行有这样特点:
– main方法是整个应用程序的运行起点,也是运行终 main 点.当系统开始执行main方法中的内容时,自动创 建一个main为名称 为名称的线程,该线程的优先级别自动 为名称 设为5级. main方法中的代码按调用顺序依次执行. 一直执行到最后一条语句为止,整个线程执行结束.
Java (SSXDU 2007)
线程
在Java程序中创建多线程操作,必须继承 Thread类或者实现Runnable接口.
– 无论是继承Thread类的子类,还是实现Runnable 接口的类,都必须提供run()方法, run()方法中 书写的内容就是将来线程要执行的内容. – 用户创建的线程对象要执行run()方法必须让其执行 start()方法.
3. produceResource() 4. synchronized(lock) { 5. lock.notify(); 6.}
Java (SSXDU 2007)
线程
多线程程序: TestFactorialThread.java
– 创建另一个类,该类中提供main方法.main方法 Thread FactorialThread 中,创建Thread类的子类FactorialThread类的 对象,该对象就是一个线程对象.这样就产生一个新 的线程对象.然后调用新的线程对象的start方法, 新的线程将自动进入run方法.在Java虚拟机管理下, 主线程和新的线程同时运行,一直到各个线程运行结 束为止,整个程序才结束.
Java (SSXDU 2007) 进程p1 操作系统 进程p2 共享内存 进程p3 局部内存 局部内存
局部内存
进程p1 操作系统 进程p2
进程p3: Java虚拟机 全局变量
线程T1
局部变量
线程T2
局部变量
Java (SSXDU 2007)
线程
在Java程序中创建多线程操作,必须继承Thread类或 者实现Runnable接口.