您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > linux/Unix相关 > 7.Java 多线程
上海交通大学计算机科学与工程系7.Java多线程上海交通大学计算机科学与工程系2020/9/202内容多线程基本概念Java多线程创建多线程线程的状态控制Java多线程的一些问题小结注:本课件部分材料来自网络上海交通大学计算机科学与工程系2020/9/2031多线程基本概念文件输入输出装置各种系统资源数据区段程序区段只有一个地方在执行文件输入输出装置各种系统资源数据区段程序区段同时有数个地方在执行传统的进程多线程的任务上海交通大学计算机科学与工程系2020/9/204多线程的优势:减轻编写交互频繁、涉及面多的程序的困难程序的吞吐量会得到改善由多个处理器的系统,可以并行运行不同的线程(否则,任何时刻只有一个线程在运行,形成并发运行)上海交通大学计算机科学与工程系2020/9/205线程与进程的区别:多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小上海交通大学计算机科学与工程系多线程编程原则安全性:如果两个以上的线程访问同一对象时,一个线程会损坏另一个线程的数据,这就违反了安全性原则可行性:如果仅仅实现了安全性,程序却在某一点后不能继续执行或者多个线程发生死锁,那么这样的程序也不能作为真正的多线程程序来应用高性能:多线程的目的是为了增加程序运行的性能2020/9/206上海交通大学计算机科学与工程系2020/9/2072.Java线程概念对线程的综合支持是Java技术的一个重要特色.它提供了thread类、监视器和条件变量的技术.虽然许多操作系统支持多线程,但若要用C或C++编写多线程程序是十分困难的,因为它们对数据同步的支持不充分.上海交通大学计算机科学与工程系线程对象和线程的区别:线程对象是可以产生线程的对象比如在java平台中Thread对象,Runnable对象。线程,是指正在执行的一个指令序列。在java平台上是指从一个线程对象的start()开始,运行run方法体中的那一段相对独立的过程。2020/9/208上海交通大学计算机科学与工程系思考如果我们成功编译了该JAVA文件,然后运行发生的过程…JVM进程启动,JVM产生一个主线程还有一些其它线程,例如垃圾回收等2020/9/209classBeginClass{publicstaticvoidmain(String[]args){for(inti=0;i100;i++)System.out.println(Hello,World!);}}上海交通大学计算机科学与工程系剖析多线程程序2020/9/2010classMyThreadextendsThread{publicvoidrun(){System.out.println(Threadsay:Hello,World!);}}publicclassMoreThreads{publicstaticvoidmain(String[]args){newMyThread();newMyThread().start();System.out.println(Mainsay:Hello,World);}}上海交通大学计算机科学与工程系2020/9/20113.创建多线程Runnable与Thread1.publicclassmythreadextendsAppletimplementsRunnable(小应用或已经是某个类的子类时)2.继承类ThreadpublicclassmythreadextendsThread创建方法:newthread=newThread(this);newthread.start();上海交通大学计算机科学与工程系2020/9/2012Runable与Thread的区别使用runable最主要的原因是:java缺少多重继承的机制,可能你的类已经继承了其他类了,这时你无法继承自thread类,只能用runnable了Runable创建的线程共享数据区上海交通大学计算机科学与工程系publicclassTest{publicstaticvoidmain(String[]args)throwsException{MyThreadmt=newMyThread();mt.start();mt.join();Thread.sleep(3000);mt.start();}}输出:Exceptioninthreadmainjava.lang.IllegalThreadStateException说明:通过Thread实例的start(),一个Thread的实例只能产生一个线程2020/9/2013上海交通大学计算机科学与工程系2020/9/2014classRimplementsRunnable{privateintx=0;publicvoidrun(){for(inti=0;i100;i++){try{Thread.sleep(10);}catch(Exceptione){}System.out.println(x++);}}}publicclassTest{publicstaticvoidmain(String[]args)throwsException{Rr=newR();for(inti=0;i10;i++)newThread(r).start();}}上海交通大学计算机科学与工程系2020/9/2015packagedebug;importjava.io.*;importjava.lang.Thread;classMyThreadextendsThread{publicintx=0;publicvoidrun(){System.out.println(++x);}}classRimplementsRunnable{privateintx=0;publicvoidrun(){System.out.println(++x);}}publicclassTest{publicstaticvoidmain(String[]args)throwsException{for(inti=0;i10;i++){Threadt=newMyThread();t.start();}Thread.sleep(10000);//让上面的线程运行完成Rr=newR();for(inti=0;i10;i++){Threadt=newThread(r);t.start();}}}上海交通大学计算机科学与工程系2020/9/2016重要的方法start()从CPU中申请另一个线程空间来执行run()方法中的代码run()是运行线程的主体,启动线程时,由java直接调用publicvoidrun()如果你不调用Start,直接调用run,会如何?stop()停止线程,调用线程的newthread.stop()(不是安全的处理)sleep方法暂停线程的执行,让其它线程得到机会,sleep要丢出异常,必须抓住:Try{sleep(100)}catch(InterruptedExceptione){}上海交通大学计算机科学与工程系2020/9/2017importjavax.swing.*;publicclassApplet1extendsJApplet{mythreadt1=newmythread();publicvoidinit(){t1.start();}classmythreadextendsThread{publicvoidrun(){for(inti=0;i4;i++)System.out.println(+i);{try{sleep(400);}catch(InterruptedExceptione){}}}}}上海交通大学计算机科学与工程系2020/9/20187.2创建线程的方式importjavax.swing.*;importjava.awt.*;publicclassApplet1extendsJApplet{Ct1=newC(this);publicvoidinit(){t1.start();}publicvoidpaint(Graphicsg){g.drawString(Hello,java,10,50);}}classCextendsThread{Applet1a;C(Applet1b){a=b;}publicvoidrun(){while(true){a.repaint();try{sleep(400);}catch(InterruptedExceptione){}}}}上海交通大学计算机科学与工程系join:等待线程执行完毕,被等待的那个线程不结束,当前线程就一直等待.2020/9/2019publicclassTest{publicstaticvoidmain(String[]args)throwsException{MyThreadmt=newMyThread();mt.start();mt.join();System.out.println(101);}}上海交通大学计算机科学与工程系2020/9/2020其它常用的方法isAlive:判断线程目前是否正在执行状态中if(newthread.isAlive())newthread.stop();resume:要求被暂停线程继续执行suspend:暂停线程的执行yield:将执行的权力交给其它线程,自己到队列的最后等待.上海交通大学计算机科学与工程系2020/9/2021线程的优先权某一时刻只有一个线程在执行,调度策略为固定优先级调度.newthread.setPriority(Thread.MIN_PRIORITY)级别有:MIN-PRIORITYNOM_PRIORITYMAX-PRIORITY自私的线程:有很高的优先权的线程,不主动睡眠或让出处理器控制权.上海交通大学计算机科学与工程系2020/9/20224.线程的状态控制newThread()NewThreadRunnablestart()NotRunnablestop()stop()Deadyield()stop()orrun()exit..suspend()sleep()wait()resume().线程的状态上海交通大学计算机科学与工程系2020/9/2023当一个线程执行完所有语句后就自动终止调用线程的stop()方法,也可以强制终止线程,可能产生不完整的残废数据。如果希望线程正常终止,可采用标记来使线程中的run()方法退出上海交通大学计算机科学与工程系2020/9/2024publicclassXyzimplementsRunnable{privatebooleantimeToQuit=false;publicvoidrun(){while(!timeToQuit){…..}//cleanupbeforerun()ends;}publicvoidstopRunning(){timeToQuit=true;}}上海交通大学计算机科学与工程系2020/9/2025publicclassControlThread{privateRunnabler=newXyz();privateThreadt=newThread(r);publicvoidstartThread(){t.start();}publivoidstopThread(){r.stopRunning();}}上海交通大学计算机科学与工程系2020/9/2026暂停线程的执行等待条件满足再执行下面的例子显示线程的挂起和唤醒Applet第一次开始时,线程被启动浏览器改变页面时,小应用程序的stop()方法被调用,线程被挂起.浏览器回到原来的页面时,线程被唤醒.上海交通大学计算机科学与工程系2020/9/2027publicvoidstart(){if(mythread=
本文标题:7.Java 多线程
链接地址:https://www.777doc.com/doc-7028472 .html