java多线程ppt课件

java多线程ppt课件

ID:19415680

大小:478.86 KB

页数:18页

时间:2018-10-02

上传者:U-5097
java多线程ppt课件_第1页
java多线程ppt课件_第2页
java多线程ppt课件_第3页
java多线程ppt课件_第4页
java多线程ppt课件_第5页
资源描述:

《java多线程ppt课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

JAVA多线程 线程的基本概念线程的创建和启动线程的调度和优先级线程的状态控制线程同步JAVASE基础 线程的基本概念线程是一个程序内部的顺序控制流。线程和进程的区别每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。线程可以看成时轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。多进程:在操作系统中能同时运行多个任务(程序)多线程:在同一应用程序中有多个顺序流同时执行Java的线程是通过java.lang.Thread类来实现的。VM启动时会有一个由主方法(publicstaticvoidmain(){})所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thead类的start()方法来启动一个线程。 线程的创建和启动可以有两种方式创建新的线程。第一种定义线程类实现Runnable接口ThreadmyThread=newThead(target)//target为Runnable接口类型。Runnable中只有一个方法:publicvoidrun();用以定义线程运行体。使用Runnable接口可以为多个线程提供共享的数据。在实现Runnable接口的类的run方法定义中可以使用Thread的静态方法:publicstaticThreadcurrentThread()获取当前线程的引用。第二种可以定义一个Thread的子类并重写其run方法如:classMyThreadextendsThead{publicvoidrun(){…}}然后生成该类的对象:MyThreadmyThread=newMyThead(…)使用那种好呢? 线程状态转换 方法功能isAlive()判断线程是否还“活”着,即线程是否还未终止。getPriority()获得线程的优先级数值setPriority()设置线程的优先级数值Thread.sleep()将当前线程睡眠指定毫秒数join()调用某线程的该方法,将当前线程与该线程“合并”,即等待该线程结束,再恢复当前线程的运行。yield()让出CPU,当前线程进入就绪队列等待调度。wait()当前线程进入对象的waitpool。notify()/notifyAll()唤醒对象的waitpool中的一个/所有等待线程。线程状态转换 sleep/join/yield方法sleep方法可以调用Thread的静态方法:publicstaticvoidsleep(longmillis)throwsInterruptedException使得当前线程休眠(暂时停止执行millis毫秒)。由于是静态方法,sleep可以由类名直接调用:Thread.sleep(…)join方法合并某个线程yield方法让出CPU,给其他线程执行的机会 线程模式两种线程模式:协作式:一个线程保留对处理器的控制直到它自己决定放弃速度快、代价低用户编程非常麻烦抢先式。系统可以任意的从线程中夺回对CPU的控制权,再把控制权分给其它的线程。两次切换之间的时间间隔就叫做时间片效率不如协作式高,OS核心必须负责管理线程简化编程,而且使程序更加可靠多数线程的调度是抢先式的。 线程的优先级别Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪个线程来执行。线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5。Thread.MIN_PRIORITY=1Thread.MAX_PRIORITY=10Thread.NORM_PRIORITY=5使用下述线方法获得或设置线程对象的优先级。intgetPriority();voidsetPriority(intnewPriority);不同平台上的优先级Solaris:相同优先级的线程不能相互抢占对方的cpu时间。windows:可以抢占相同甚至更高优先级的线程的cpu时间 临界资源问题(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];}} 临界资源问题(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没有入栈,产生这种问题的原因在于对共享数据访问的操作的不完整性。 线程同步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的线程");}} Synchronized总结无论synchronized关键字加在方法上还是对象上,它取得的锁都是锁在了对象上,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。每个对象只有一个锁(lock)与之相关联。实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程序。还有一些技巧可以让我们对共享资源的同步访问更加安全:定义private的instance变量+它的get方法,而不要定义public/protected的instance变量。如果将变量定义为public,对象在外界可以绕过同步方法的控制而直接取得它,并改动它。如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance对象的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。这个时候就需要将get方法也加上synchronized同步,并且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了。 线程同步在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记保证在任一时刻,只能有一个线程访问该对象。关键字synchronized来与对象的互斥锁联系。当某个对象synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。………synchronized(this){num++;try{Thread.sleep(1);}catch(InterruptedExceptione){}System.out.println(name+",你是第"+num+"个使用timer的线程");}………synchronized的使用方法:synchronized还可以放在方法声明中,表示整个方法为同步方法,例如:synchronizedpublicvoidadd(Stringname){…} 面试:Waitsleep区别来源不同Sleep是Thread提供的方法Wait继承自Object代码位置不同Wait需要写在Synchronize语句块里面是否释放锁定对象调用wait方法,释放锁定该对象Sleep时别的线程也不可以访问锁定对象 总结线程、进程的概念线程的创建和启动方式线程的调度和优先级SleepJoinYieldsynchronizedWaitNotify、notifyAll Q&AAnyQuestion? 谢谢大家

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭