Java线程(上)_第1页
Java线程(上)_第2页
Java线程(上)_第3页
Java线程(上)_第4页
Java线程(上)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论