java课件08线程2学时_第1页
java课件08线程2学时_第2页
java课件08线程2学时_第3页
java课件08线程2学时_第4页
java课件08线程2学时_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

主讲教师张智计算机学院网络工程系8

线程8.1线程概念8.2创建线程8.3线程同步8.4线程间协作8.1线程概念认识线程(从OS系统角度)现在的OS都是多任务操作系统,比如你在听歌的同时还在用QQ聊天。听歌和聊天就是两个任务,这两个任务是“同时”进行的。一个任务一般对应一个进程,也可能包含好几个进程。微观:在一个进程中,可能有多个不同功能的程序块,例如某个程序块正在等待打印机,此时CPU是空闲的,其他程序块可利用这个时机抢占CPU执行计算。进程中这样的程序块就称为线程。多线程的目的是为了最大限度的利用CPU资源。8.1线程概念(续)一般的Java程序都是单线程的比如,用Java命令运行一个最简单的HelloWorld的Java程序时,就启动了一个JVM进程,JVM找到程序的入口点main(),然后运行main()方法,这样就产生了一个main线程(主线程)。当main方法结束后,主线程运行完成。JVM进程也随即退出。8.1线程概念(续)进程是正在执行的程序。线程是进程中一个单一的顺序控制流程。一个或更多的线程构成了一个进程。线程是进程中的一个实体,是能被OS独立调度和分派的基本单位。【Return】8.2创建线程classHelloThreadimplementsRunnable{inti;

publicvoidrun(){

//重写run()方法i=0;while(true){System.out.println("Hello"+i++);if(i>5)break;

}

}}publicclasstestThread{publicstaticvoidmain(String[]args){

HelloThreadr=newHelloThread();Threadt=newThread(r);t.start();}}Thread类构造函数用Runnable的一个实例来创建一个线程启动线程线程类实现Runnable接口,并重写run()方法运行结果:Hello0Hello1Hello2Hello3Hello4Hello5多线程--前例改进一下

classHelloThreadimplements

Runnable{inti;publicvoidrun(){//重写Runnable接口的run()方法i=0;while(true){

System.out.println("当前线程:"+Thread.currentThread().getName());

System.out.println("Hello"+i++);if(i>5)break;

}

}}publicclasstestThread{publicstaticvoidmain(String[]args){

HelloThreadr=newHelloThread();

Threadt1=newThread(r);t1.start();Threadt2=newThread(r);t2.start();}}新加语句2个线程当前线程:Thread-0当前线程:Thread-1Hello0当前线程:Thread-0Hello1Hello2当前线程:Thread-1Hello3当前线程:Thread-1Hello4当前线程:Thread-1Hello5当前线程:Thread-0Hello6一个可能的结果本例中两个线程共享数据和代码【Return】8.3线程同步由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。理解同步:有只苹果,我拿起来咬一口,放下,你再拿起咬一口,这就是同步。要是大家一起咬,呵呵…类中有一个私有成员:一个苹果,两个方法:一个看,一个吃。

不同步:我一“看”,有一个苹果,我“吃”四分之一;你一“看”,有一个苹果,也“吃”四分之一。可能的情况是你只能吃到3/4的1/4。

同步:我在吃的时候你看被锁,等吃完了,你再看,啊3/4个苹果,那就吃1/3好了,就这样你也吃了1/4!synchronized关键字synchronized修饰代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。synchronized修饰某个方法时,表明该方法只能有一个线程执行,其他线程处于等待状态。synchronized修饰某个类的声明时,表明这类中的所有方法都是synchronized的。示例--同步代码块classHelloThreadimplementsRunnable{inti;publicvoidrun(){//重写Runnable接口的run()方法synchronized(this){i=0;while(true){System.out.println("当前线程:"+Thread.currentThread().getName());System.out.println("Hello"+i++);if(i>5)break;}}

}}改写前例观察运行结果(见后)注意写法当前线程:Thread-0Hello0当前线程:Thread-0Hello1当前线程:Thread-0Hello2当前线程:Thread-0Hello3当前线程:Thread-0Hello4当前线程:Thread-0Hello5当前线程:Thread-1Hello0当前线程:Thread-1Hello1当前线程:Thread-1Hello2当前线程:Thread-1Hello3当前线程:Thread-1Hello4当前线程:Thread-1Hello5同步代码块运行结果第二个线程等待第一个线程结束后才能访问同步代码块示例--同步方法classHelloThreadimplementsRunnable

inti=0;

synchronized

publicvoidshow(){

System.out.println("当前线程:"+Thread.currentThread().getName()); System.out.println("Hello"+i++);

}

publicvoidrun(){

while(true){

show(); if(i>5)break; } }}改写前例观察运行结果注意区别前例当前线程:Thread-0Hello0当前线程:Thread-0Hello1当前线程:Thread-0Hello2当前线程:Thread-0Hello3当前线程:Thread-0Hello4当前线程:Thread-0Hello5当前线程:Thread-1Hello6【Return】第二个线程等待第一个线程结束后才能访问同步方法注意写法8.4线程间协作通常,多线程之间需要协调工作。例如,浏览器的一个显示图片的线程displayThread想要执行显示图片的任务,必须等待下载线程downloadThread将该图片下载完毕。如果图片还没有下载完,displayThread可以暂停,当downloadThread完成了任务后,再通知displayThread“图片准备完毕,可以显示了”,这时,displayThread继续执行。简单的说就是:如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒。在Java中,这个机制的实现依赖于wait/notify。wait/notify描述synchronized(obj){while(!condition){

obj.wait();}obj.doSomething();}synchronized(obj){

condition=true;

obj.notify();}在另一线程B中,如果B使得线程A的condition条件满足了,就可以唤醒线程A。当线程A获得了obj后,发现条件condition不满足,无法继续下一处理,于是线程A就wait()。wait()、notify()、notifyAll()wait():释放已持有的锁,进入wait队伍。notify():唤醒wai

温馨提示

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

评论

0/150

提交评论