java培训第九章线程.ppt_第1页
java培训第九章线程.ppt_第2页
java培训第九章线程.ppt_第3页
java培训第九章线程.ppt_第4页
java培训第九章线程.ppt_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、第9章 线程,9.1基本概念 9.2Java线程 9.3线程状态 9.4线程优先级 9.5线程同步,什么是进程? 进程就是一个在内存中独立运行的程序,有自己的地址空间 。 “多任务”:指操作系统能同时运行多个进程(程序)。如WIN2K系统可以同时运行写字板程序、画图程序、WORD、EXCEL等。 线程: 是进程内部单一的一个顺序控制流。,9.1 基本概念,文件,输入输出装置,各种系统资源,数据区段,程序区段,只有一个地方在执行,文件,输入输出装置,各种系统资源,程序区段,同时有数个地方在执行,传统的进程,多线程的任务,多线程,多线程的优势 减轻编写交互频繁、涉及面多的程序的困难。 程序的吞吐量

2、会得到改善。 有多个处理器的系统,可以并发运行不同的线程。(否则,任何时刻只有一个线程在运行),关系:一个进程包含一个或多个线程,JAVA线程的概念模型 虚拟的CPU,由java.lang.Thread类封装和虚拟 CPU所执行的代码,传递给Thread类对象。 CPU所处理的数据,传递给Thread类对象。,代 码,数 据,虚拟CPU,Java线程模型,线程体 Java的线程是通过java.lang.Thread类来实现的。 每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体(即线程的可执行代码)。,主线程 在任何Java程序启动时,一

3、个线程立刻运行(即mian方法对应的线程),该线程通常称为程序的主线程。 主线程的特点: 它是产生其他子线程的线程。 它不一定是最后完成执行的线程,子线程可能在它结束之后还在运行。,创建线程方法(两种) 声明一个 Thread 类的子类,并覆盖 run() 方法。 class mythread extends Thread public void run( ) /* 覆盖该方法*/ 声明一个实现 Runnable 接口的类,并实现 run() 方法。 class mythread implements Runnable public void run( ) /* 实现该方法*/ 用start(

4、)方法启动线程: Thread t1 = new Thread(); T1.start();,9.2 Java线程,public class TestThread /主类用于执行程序,不扩展Thread类 public static void main(String args) Thread t = new MyThread();/创建线程对象 t. start();/启动线程t,它会自动调用run方法 class MyThread extends Thread /线程类,必须扩展Thread类 public void run() /线程对象的可执行代码 for(int i=0; i5; i+

5、) System.out.println(SubThread: + i); ,(1)继承Thread类,(2)实现Runnable接口,class HelloRunner implements Runnable int i; public void run() i = 0; while (true) System.out.println(Hello + i+); if (i = 50) break; ,class TestRunner public static void main(String args) HelloRunner r = new HelloRunner(); Thread t

6、 = new Thread(r); t.start(); ,扩展,public static void main(String args ) HelloRunner r = new HelloRunner(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start(); t2.start(); ,思考:两种定义线程的方法中,哪一种更常用?,线程共有下面4种状态: new(新建):当你用new创建一个线程时,该线程尚未运行。 runnable(可运行):一旦调用了start方法,该线程便是一个可运行的线程。可运行的线程可以尚

7、未执行,也可以正在执行,取决于线程调度的结果 blocked(被中断运行):当出现下列操作之一时,线程便进入中断状态: 有人调用该线程的sleep()方法; 该线程调用了wait()方法; 该线程调用了一个在输入输出时中断的操作,也就是说,在输入和输出操作完成之前,该操作不会返回到它的调用程序; 该线程试图锁定一个当前被另一个线程锁定了的对象 dead(死亡):由于下面两个原因,线程将变成死线程: 由于run方法的正常退出而自然死亡; 没有捕获到的异常事件终止了run方法的执行,从而导致线程突然死亡;,9.3线程的状态,线程的状态转移,线程常用方法,import java.util.*; pu

8、blic class TestSleep public static void main(String args ) MyThread thread=new MyThread(); thread.start(); try Thread.sleep(5000); catch(InterruptedException e) errupt(); class MyThread extends Thread public void run() while(true) System.out.println(=+new Date(); try Thread.sleep(1000); ca

9、tch(InterruptedException e) return; ,sleep()与interrupt(),join()方法,public class TestJoin public static void main(String args ) MyThread1 thread1=new MyThread1(t1); thread1.start(); try thread1.join(); catch(InterruptedException e) for(int i=1;i=5;i+) System.out.println(i am main thread); class MyThre

10、ad1 extends Thread MyThread1(String s) super(s); public void run() for(int i=1;i=5;i+) System.out.println(i am +getName(); try Thread.sleep(1000); catch(InterruptedException e) return; ,yield()方法,public class TestYield public static void main(String args ) MyThread2 t1=new MyThread2(t1); MyThread2 t

11、2=new MyThread2(t2); t1.start(); t2.start(); class MyThread2 extends Thread MyThread2(String s) super(s); public void run() for(int i=1;i=50;i+) System.out.println(getName()+:+i); if(i%10=0) yield(); ,下述方法可以对优先级进行操作:(线程的优先级高,运行的机会多)int getPriority(); /得到线程的优先级void setPriority(int newPriority);/当线程被创

12、建后,可通过此方法改变线程的优先级,9.4线程的优先级,class ThreadTestpublic static void main( String args ) Thread t1 = new MyThread(“T1”);t1.setPriority( Thread.MIN_PRIORITY ); t1.start( );Thread t2 = new MyThread(“T2”);t2.setPriority( Thread.MAX_PRIORITY ); t2.start( );Thread t3 = new MyThread(“T3”);t3.setPriority( Thread

13、.MAX_PRIORITY ); t3.start( ); ,class MyThread extends Thread String message;MyThread ( String message ) this.message = message;public void run() for ( int i=0; i3; i+ )System.out.println( message+ +getPriority() ); ,优先级的例子:,9.5 线程同步,为何同步? 线程可以共享数据 多个线程访问同一个对象,访问同一个方法,修改该对象的属性,锁标志:与每个对象相关联的标志 synchronized 使用该关键字与对象锁标志交互 线程调用synchronized方法时,对象转入“锁定”状态 保护机制:加锁标志、释放锁标志,public void push(char c) synchronized(this) dataidx = c; idx+; ,public synchronized void push(char c) dataidx = c; idx+; ,说明:普通方法访问前不需要得到锁标志,实例:Test

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论