版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java线程(上)线程(上)ID:SCSJ002-J2SEJava线程(上)线程(上)v线程概述线程概述vJava线程模型线程模型v创建线程创建线程v后台线程(守护线程)后台线程(守护线程)v线程的线程的join()方法方法2011-05-032线程概述线程概述v多进程:在操作系统中能(同时)运行多个任务多进程:在操作系统中能(同时)运行多个任务(程序程序)v多线程:在同一应用程序中有多个顺序流(同时)多线程:在同一应用程序中有多个顺序流(同时)执行执行2011-05-033Java线程模型线程模型v 虚拟的虚拟的CPU,由,由java.lang.Thread类封装和虚拟类封装和虚拟CPU来实
2、现。来实现。v CPU所执行的代码,传递给所执行的代码,传递给Thread类对象。类对象。v CPU所处理的数据,传递给所处理的数据,传递给Thread类对象。类对象。代 码数 据虚拟CPUJava线程模型2011-05-034创建线程创建线程v 通过通过java.lang.Thread来创建一个线程来创建一个线程v Thread的构造器:的构造器: Thread() Thread(Runnable target) Thread(Runnable target, String name) Thread(String name) Thread(ThreadGroup group, Runnabl
3、e target) Thread(ThreadGroup group, Runnable target, String name) Thread(ThreadGroup group, String name) 2011-05-035启动线程启动线程v 每个线程都是通过某个特定每个线程都是通过某个特定ThreadThread对象所对应的方法对象所对应的方法run( )run( )来完成其操作的,来完成其操作的,方法方法run( )run( )称为线程体。称为线程体。v 使用使用start()start()方法方法,线程进入,线程进入RunnableRunnable(可运行)状态,(可运行)状态,
4、它将向线程调度器注册这个线程。它将向线程调度器注册这个线程。v 调用调用start()start()方法方法并不一定马上会执行这个线程并不一定马上会执行这个线程,正如,正如上面所说,它只是进入上面所说,它只是进入RunnableRunnable 而不是而不是RunningRunning。v 注意,不要直接在程序中调用线程的注意,不要直接在程序中调用线程的run()run()方法。方法。2011-05-036创建并启动线程例子创建并启动线程例子public classpublic class TestThreadTestThread extendsextends ThreadThread pub
5、lic voidpublic void run() run()forfor( (intint i = 0; i 100; i+) i = 0; i 100; i+) SystemSystem.out.println(.out.println(Count:Count:+i);+i); public static voidpublic static void main( main(StringString args) args)TestThreadTestThread tt = tt = new new TestThreadTestThread();();/注意,不要直接调用注意,不要直接调用ru
6、nrun方法方法tt.start();tt.start(); 2011-05-037创建线程的另一种方式创建线程的另一种方式v通过实现通过实现Runnable接口并实现接口中定义的唯接口并实现接口中定义的唯一方法一方法run(),可以创建一个线程,可以创建一个线程public class TestThreadTestThread implements Runnable public void run() for(int i = 0; i 100; i+) SystemSystem.out.println(Count:+i); public static void main(StringStri
7、ng args) TestThreadTestThread tt = new TestThreadTestThread(); ThreadThread t = new ThreadThread(tt); t.start();2011-05-038两种线程创建方式的比较两种线程创建方式的比较v 使用使用Runnable接口接口 可以将CPU,代码和数据分开,形成清晰的模型; 还可以从其他类继承; 保持程序风格的一致性。v 直接继承直接继承Thread类类 不能再从其他类继承; 编写简单,可以直接操纵线程,无需使用Thread.currentThread()。2011-05-039结束线程结束线程
8、v线程会以以下三种方式之一结束:线程会以以下三种方式之一结束: 线程到达其 run() 方法的末尾; 线程抛出一个未捕获到的 Exception 或 Error;/下面线程何时结束?public class TestThreadTestThread implements Runnable public void run() for(int i = 0; i 100; i+) SystemSystem.out.println(Count:+i); 2011-05-0310后台线程后台线程v有一种线程,它是在后台运行的,它的任务是为有一种线程,它是在后台运行的,它的任务是为其他的线程提供服务,这种
9、线程被称为其他的线程提供服务,这种线程被称为后台线后台线程(程(Daemon Thread),又称为,又称为守护线程守护线程public static void main(StringString args) TestThreadTestThread tt = new TestThreadTestThread(); ThreadThread t = new ThreadThread(tt); /设置为后台线程,主线程结束,后台线程自动结束。设置为后台线程,主线程结束,后台线程自动结束。 t.setDaemon(t.setDaemon(truetrue); ); t.start();2011-0
10、5-0311线程的线程的join方法方法vThread API 包含了等待另一个线程完成的方包含了等待另一个线程完成的方法:法:join() 方法。当调用方法。当调用 Thread.join() 时,时,调用线程将阻塞,直到被调用线程将阻塞,直到被join方法加入的目标线方法加入的目标线程完成为止。程完成为止。 vThread.join() 通常由使用线程的程序调用,通常由使用线程的程序调用,以将大问题划分成许多小问题,每个小问题分配以将大问题划分成许多小问题,每个小问题分配一个线程。当所有的小问题都得到处理后,再调一个线程。当所有的小问题都得到处理后,再调用主线程来进一步操作。用主线程来进一
11、步操作。2011-05-0312join方法例子方法例子public classpublic class Key2FileKey2File extends extends ThreadThread StringString path; path; publicpublic Key2FileKey2File( (StringString path) path) thisthis.path = path.path = path public voidpublic void run() run() forfor( (intint i = 0; i 100; i+) i = 0; i 100; i+)
12、 ThreadThread.sleep(1000); .sleep(1000); /休息休息10001000毫秒毫秒 StringString name = name = StringString.format(.format(“%s/%d.txt”“%s/%d.txt”, , path, i); path, i); OutputStream OutputStream out = out = newnew FileOutputStreamFileOutputStream(name);(name); out.write( out.write(“hello”“hello”.getBytes();.
13、getBytes(); out.close(); out.close(); publicpublic staticstatic voidvoid main(String args) trytry Key2File k = newnew Key2File10; for for(intint i = 1; i = 10; i+) ki-1 = newnew Key2File(d:tempd“ + i + ); ki-1.start(); for for(intint i = 1; i = 10; i+) ki-1.join();ki-1.join(); catchcatch (Interrupte
14、dException e) e.printStackTrace(); System.out.println(文件创建完成。);2011-05-0313线程的简单控制线程的简单控制v 测试线程是否正处于测试线程是否正处于Runnable状态状态 isAlive()v 中断线程中断线程 Thread.sleep() Thread.yield()v 设置线程的优先级设置线程的优先级 getPriority() setPriority()2011-05-0314线程状态线程状态RunnableRunningBlockedNewstart()run() 运行完毕线程调度阻塞事件解除阻塞Dead2011-
15、05-0315与线程控制有关的方法与线程控制有关的方法start() 新建的线程进入Runnable状态run() 线程进入Running 状态 wait()线程进入等待状态,等待被notify,这是一个对象方法,而不是线程方法notify()/notifyAll()唤醒其他的线程,这是一个对象方法,而不是线程方法 yield()线程放弃执行,使其他优先级不低于此线程的线程有机会运行,它是一个静态方法getPriority()/setPriority()获得/设置线程优先级sleep()线程睡眠指定的一段时间join()调用这个方法的主线程,会等待加入的子线程完成2011-05-0316作业:作业:v主线程接受键盘输入主线程接受键盘输入,子线程每子线程每1秒钟一次,判断秒钟一次,判断指定的某个目录下的某个文件是否被修改,如果指定的某个目录下的某个文件是否被修改,如果被修改,就在被修改,就在Console上打印出上打印出“File changed”v将一个将一个500M的文件,用的文件,用4个线程搬运到另外一个线程搬运到另外一个文件目录里去。个文件目录里去。v查看一个目录,根据文件的数目,启动相应的线查看一个目录,根据文件的数目,启动相应的线程数,将文件拷贝到另外一个目录里面去。程数,将文件拷贝到
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 填土工程转让合同范本
- 外包物业用电协议合同
- 国外技术合作合同范本
- 外贸购销合同补充协议
- 培训课程转让合同范本
- 国际运输服务合同范本
- 国企投资企业合同范本
- 2025年网页设计师创意能力评定试卷及答案解析
- 入党积极分子发展对象考试考前冲刺测试卷讲解及完整答案详解(考点梳理)
- 国家二级建造师《水利水电工程管理与实务》模拟真题B卷 含答案
- 中国联通辽宁地区2025秋招笔试行测题库及答案行业解决方案经理岗
- 医院患者服务满意度调查表模板
- 土壤沉积物中可溶性有机质对辣根过氧化物酶催化氧化去除双酚A的作用机制探究
- 国开2025年秋《农业推广》形成性考核1-3答案
- 宫颈癌放疗患者的护理
- (2025秋新版)苏教版二年级数学上册全册教案
- DB-T 29-88-2025 天津市民用建筑围护结构节能检测技术规程
- 竞聘词课件教学课件
- 2025-2026学年大象版(2024)小学科学三年级上册(全册)教学设计(附目录P208)
- 融媒体概论课件
- 中央空调系统维护技术规范
评论
0/150
提交评论