JAVA多线程主题知识讲座_第1页
JAVA多线程主题知识讲座_第2页
JAVA多线程主题知识讲座_第3页
JAVA多线程主题知识讲座_第4页
JAVA多线程主题知识讲座_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

JAVA多线程JAVA多线程主题知识讲座第1页线程的基本概念

线程的创建和启动

线程的调度和优先级线程的状态控制

线程同步JAVASE基础JAVA多线程主题知识讲座第2页线程基本概念线程是一个程序内部次序控制流。线程和进程区分每个进程都有独立代码和数据空间(进程上下文),进程间切换会有较大开销。线程能够看成时轻量级进程,同一类线程共享代码和数据空间,每个线程有独立运行栈和程序计数器(PC),线程切换开销小。多进程:在操作系统中能同时运行多个任务(程序)多线程:在同一应用程序中有多个次序流同时执行Java线程是经过java.lang.Thread类来实现。

VM开启时会有一个由主方法(publicstaticvoidmain(){})所定义线程。能够经过创建Thread实例来创建新线程。每个线程都是经过某个特定Thread对象所对应方法run()来完成其操作,方法run()称为线程体。经过调用Thead类start()方法来开启一个线程。JAVA多线程主题知识讲座第3页线程创建和开启可以有两种方式创建新线程。第一种定义线程类实现Runnable接口ThreadmyThread=newThead(target)//target为Runnable接口类型。Runnable中只有一个方法:publicvoidrun();用以定义线程运行体。使用Runnable接口可认为多个线程提供共享数据。在实现Runnable接口类run方法定义中可以使用Thread静态方法:publicstaticThreadcurrentThread()获取当前线程引用。第二种可以定义一个Thread子类并重写其run方法如:classMyThreadextendsThead{publicvoidrun(){…}}然后生成该类对象: MyThreadmyThread=newMyThead(…)使用那种好呢?JAVA多线程主题知识讲座第4页线程状态转换JAVA多线程主题知识讲座第5页方法功能isAlive()判断线程是否还“活”着,即线程是否还未终止。getPriority()取得线程优先级数值setPriority()设置线程优先级数值Thread.sleep()将当前线程睡眠指定毫秒数join()调用某线程该方法,将当前线程与该线程“合并”,即等候该线程结束,再恢复当前线程运行。yield()让出CPU,当前线程进入就绪队列等候调度。wait()当前线程进入对象waitpool。notify()/notifyAll()唤醒对象waitpool中一个/全部等候线程。线程状态转换JAVA多线程主题知识讲座第6页sleep/join/yield方法sleep方法能够调用Thread静态方法:

publicstaticvoidsleep(longmillis)throwsInterruptedException

使得当前线程休眠(暂时停顿执行millis毫秒)。因为是静态方法,sleep能够由类名直接调用:

Thread.sleep(…)join方法合并某个线程yield方法让出CPU,给其它线程执行机会JAVA多线程主题知识讲座第7页线程模式两种线程模式:协作式:一个线程保留对处理器控制直到它自己决定放弃速度快、代价低用户编程非常麻烦抢先式。系统能够任意从线程中夺回对CPU控制权,再把控制权分给其它线程。两次切换之间时间间隔就叫做时间片

效率不如协作式高,OS关键必须负责管理线程简化编程,而且使程序愈加可靠多数线程调度是抢先式。JAVA多线程主题知识讲座第8页线程优先级别Java提供一个线程调度器来监控程序中开启后进入就绪状态全部线程。线程调度器按照线程优先级决定应调度哪个线程来执行。线程优先级用数字表示,范围从1到10,一个线程缺省优先级是5。

Thread.MIN_PRIORITY=1 Thread.MAX_PRIORITY=10 Thread.NORM_PRIORITY=5

使用下述线方法取得或设置线程对象优先级。

intgetPriority(); voidsetPriority(intnewPriority);不一样平台上优先级Solaris:相同优先级线程不能相互抢占对方cpu时间。windows:能够抢占相同甚至更高优先级线程cpu时间JAVA多线程主题知识讲座第9页临界资源问题(1)两个线程A和B在同时操纵Stack类同一个实例(堆栈),A正在往堆栈里push一个数据,B则要从堆栈中pop一个数据。classStack{ intidx=0; char[]data=newchar[6]; publicvoidpush(charc){ data[idx]=c; idx++; } publiccharpop(){ idx--; returndata[idx]; }}JAVA多线程主题知识讲座第10页临界资源问题(2)1. 操作之前data=|a|b|||||idx=22. A执行push中第一个语句,将c推入堆栈;

data=|a|b|c||||idx=23. A还未执行idx++语句,A执行被B中止,B执行pop方法,返回c:

data=|a|b|c||||idx=14. A继续执行push第二个语句:

data=|a|b|c||||idx=2

最终结果相当于c没有入栈, 产生这种问题原因在于对共享数据访问操作不完整性。JAVA多线程主题知识讲座第11页线程同时

publicclassTestimplementsRunnable{Timertimer=newTimer();publicstaticvoidmain(String[]args){Testtest=newTest();Threadt1=newThread(test);Threadt2=newThread(test);t1.setName("t1");t2.setName("t2");t1.start();t2.start();}publicvoidrun(){timer.add(Thread.currentThread().getName());}}classTimer{privatestaticintnum=0;publicvoidadd(Stringname){num++;try{Thread.sleep(1);}catch(InterruptedExceptione){}System.out.println(name+",你是第"+num+"个使用timer线程");}}JAVA多线程主题知识讲座第12页Synchronized总结不论synchronized关键字加在方法上还是对象上,它取得锁都是锁在了对象上,而不是把一段代码或函数看成锁――而且同时方法很可能还会被其它线程对象访问。每个对象只有一个锁(lock)与之相关联。实现同时是要很大系统开销作为代价,甚至可能造成死锁,所以尽可能防止无谓同时控制。搞清楚synchronized锁定是哪个对象,就能帮助我们设计更安全多线程程序。还有一些技巧能够让我们对共享资源同时访问愈加安全:定义privateinstance变量+它get方法,而不要定义public/protectedinstance变量。假如将变量定义为public,对象在外界能够绕过同时方法控制而直接取得它,并改动它。假如instance变量是一个对象,如数组或ArrayList什么,那上述方法依然不安全,因为当外界对象经过get方法拿到这个instance对象引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。这个时候就需要将get方法也加上synchronized同时,而且,只返回这个private对象clone()――这么,调用端得到就是对象副本引用了。JAVA多线程主题知识讲座第13页线程同时在Java语言中,引入了对象互斥锁概念,确保共享数据操作完整性。每个对象都对应于一个可称为“互斥锁”标识,这个标识确保在任一时刻,只能有一个线程访问该对象。关键字synchronized来与对象互斥锁联络。当某个对象synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。………synchronized(this){num++;try{Thread.sleep(1);}catch(InterruptedExceptione){}System.out.println(name+",你是第"+num+"个使用timer线程");}………

synchronized使用方法:

synchronized还能够放在方法申明中,表示整个方法为同时方法,比如:synchronizedpublicvoidadd(Stringname){…}JAVA多线程主题知识讲座第14页面试:Waitsleep区分起源不一样Sleep是Thread提供方法Wait继承自Object代码位置不一样Wait需要写在Synchronize

温馨提示

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

评论

0/150

提交评论