Java 多线程学习教程.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《Java 多线程学习教程.pptx》由会员分享,可在线阅读,更多相关《Java 多线程学习教程.pptx(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2023/2/131内容多线程基本概念Java多线程创建多线程线程的状态控制Java多线程的一些问题小结注:本课件部分材料来自网络第1页/共66页2023/2/1321 多线程基本概念文件文件输入输出装置输入输出装置各种系统资源各种系统资源数据区段数据区段程序区段程序区段只有一个地方在执行只有一个地方在执行文件文件输入输出装置输入输出装置各种系统资源各种系统资源数据区段数据区段程序区段程序区段同时有数个地方在执行同时有数个地方在执行传统的进程传统的进程多线程的任务多线程的任务第2页/共66页2023/2/133多线程的优势:减轻编写交互频繁、涉及面多的程序的困难程序的吞吐量会得到改善由多个处理
2、器的系统,可以并行运行不同的线程(否则,任何时刻只有一个线程在运行,形成并发运行)第3页/共66页2023/2/134线程与进程的区别:多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小第4页/共66页多线程编程原则安全性:如果两个以上的线程访问同一对象时,一个线程会损坏另一个线程的数据,这就违反了安全性原则可行性:如果仅仅实现了安全性,程序却在某一点后不能继续执行或者多个线程发生死锁,那么这样的程序也不能作为真正的多线程程序来应用高性能:多线程的目的
3、是为了增加程序运行的性能2023/2/135第5页/共66页2023/2/1362.Java线程概念对线程的综合支持是Java技术的一个重要特色.它提供了thread类、监视器和条件变量的技术.虽然许多操作系统支持多线程,但若要用C或C+编写多线程程序是十分困难的,因为它们对数据同步的支持不充分.第6页/共66页线程对象和线程的区别:线程对象是可以产生线程的对象比如在java平台中Thread对象,Runnable对象。线程,是指正在执行的一个指令序列。在java平台上是指从一个线程对象的start()开始,运行run方法体中的那一段相对独立的过程。2023/2/137第7页/共66页思考如果
4、我们成功编译了该JAVA文件,然后运行发生的过程JVM进程启动,JVM产生一个主线程还有一些其它线程,例如垃圾回收等2023/2/138 class BeginClass public static void main(String args)for(int i=0;i100;i+)System.out.println(Hello,World!);第8页/共66页剖析多线程程序2023/2/139class MyThread extends Thread public void run()System.out.println(Thread say:Hello,World!);public cl
5、ass MoreThreads public static void main(String args)new MyThread();new MyThread().start();System.out.println(Main say:Hello,World);第9页/共66页2023/2/13103.创建多线程Runnable与Thread1.publicclassmythreadextendsAppletimplementsRunnable(小应用或已经是某个类的子类时)2.继承类ThreadpublicclassmythreadextendsThread创建方法:newthread=ne
6、wThread(this);newthread.start();第10页/共66页2023/2/1311Runable与Thread的区别使用runable最主要的原因是:java缺少多重继承的机制,可能你的类已经继承了其他类了,这时你无法继承自thread类,只能用runnable了Runable创建的线程共享数据区第11页/共66页publicclassTestpublicstaticvoidmain(Stringargs)throwsExceptionMyThreadmt=newMyThread();mt.start();mt.join();Thread.sleep(3000);mt.s
7、tart();输出:Exceptioninthreadmainjava.lang.IllegalThreadStateException说明:通过Thread实例的start(),一个Thread的实例只能产生一个线程2023/2/1312第12页/共66页2023/2/1313class R implements Runnable private int x=0;public void run()for(int i=0;i100;i+)try Thread.sleep(10);catch(Exception e)System.out.println(x+);public class Test
8、 public static void main(String args)throws Exception R r=new R();for(int i=0;i10;i+)new Thread(r).start();第13页/共66页2023/2/1314package debug;import java.io.*;import java.lang.Thread;class MyThread extends Thread public int x=0;public void run()System.out.println(+x);class R implements Runnable priva
9、te int x=0;public void run()System.out.println(+x);public class Test public static void main(String args)throws Exception for(int i=0;i10;i+)Thread t=new MyThread();t.start();Thread.sleep(10000);/让上面的线程运行完成让上面的线程运行完成 R r=new R();for(int i=0;i10;i+)Thread t=new Thread(r);t.start();第14页/共66页2023/2/131
10、5重要的方法start()从CPU中申请另一个线程空间来执行run()方法中的代码run()是运行线程的主体,启动线程时,由java直接调用publicvoidrun()如果你不调用Start,直接调用run,会如何?stop()停止线程,调用线程的newthread.stop()(不是安全的处理)sleep方法暂停线程的执行,让其它线程得到机会,sleep要丢出异常,必须抓住:Trysleep(100)catch(InterruptedExceptione)第15页/共66页2023/2/1316importjavax.swing.*;publicclassApplet1extendsJAp
11、pletmythreadt1=newmythread();publicvoidinit()t1.start();classmythreadextendsThreadpublicvoidrun()for(inti=0;i4;i+)System.out.println(+i);trysleep(400);catch(InterruptedExceptione)第16页/共66页2023/2/13177.2 创建线程的方式importjavax.swing.*;importjava.awt.*;publicclassApplet1extendsJAppletCt1=newC(this);public
12、voidinit()t1.start();publicvoidpaint(Graphicsg)g.drawString(Hello,java,10,50);classCextendsThreadApplet1a;C(Applet1b)a=b;publicvoidrun()while(true)a.repaint();trysleep(400);catch(InterruptedExceptione)第17页/共66页join:等待线程执行完毕,被等待的那个线程不结束,当前线程就一直等待.2023/2/1318public class Test public static void main(S
13、tring args)throws Exception MyThread mt=new MyThread();mt.start();mt.join();System.out.println(101);第18页/共66页2023/2/1319其它常用的方法isAlive:判断线程目前是否正在执行状态中if(newthread.isAlive()newthread.stop();resume:要求被暂停线程继续执行suspend:暂停线程的执行yield:将执行的权力交给其它线程,自己到队列的最后等待.第19页/共66页2023/2/1320线程的优先权某一时刻只有一个线程在执行,调度策略为固定优
14、先级调度.newthread.setPriority(Thread.MIN_PRIORITY)级别有:MIN-PRIORITYNOM_PRIORITYMAX-PRIORITY自私的线程:有很高的优先权的线程,不主动睡眠或让出处理器控制权.第20页/共66页2023/2/13214.线程的状态控制new Thread()New ThreadRunnablestart()Not Runnablestop()stop()Deadyield()stop()orrun()exit.suspend()sleep()wait()resume().线程的状态第21页/共66页2023/2/1322当一个线程执
15、行完所有语句后就自动终止调用线程的stop()方法,也可以强制终止线程,可能产生不完整的残废数据。如果希望线程正常终止,可采用标记来使线程中的run()方法退出第22页/共66页2023/2/1323publicclassXyzimplementsRunnableprivatebooleantimeToQuit=false;publicvoidrun()while(!timeToQuit)./cleanupbeforerun()ends;publicvoidstopRunning()timeToQuit=true;第23页/共66页2023/2/1324publicclassControlTh
16、readprivateRunnabler=newXyz();privateThreadt=newThread(r);publicvoidstartThread()t.start();publivoidstopThread()r.stopRunning();第24页/共66页2023/2/1325暂停线程的执行等待条件满足再执行下面的例子显示线程的挂起和唤醒Applet第一次开始时,线程被启动浏览器改变页面时,小应用程序的stop()方法被调用,线程被挂起.浏览器回到原来的页面时,线程被唤醒.第25页/共66页2023/2/1326publicvoidstart()if(mythread=nul
17、l)mythread=newThread();mythread.start();elsemythread.resume();publicvoidrun()while(true)trysleep(100);catch(InterruptedExceptione)publicvoidstop()mythread.suspend();.第26页/共66页2023/2/13275.Java多线程问题执行顺序多个线程运行时,调度策略为固定优先级调度.级别相同时,由操作系统按时间片来分配下面给出的例子中,共运行三个线程,它们做同样的事,每次打印循环次数和自己的序列号,运行结果表明,它们并不是连续运行的.如
18、果给某个线程赋予较高的优先权,则发现这个进程垄断控制权thread.setPriority(Thread.MAX_PRIORITY)第27页/共66页2023/2/13287.3 多线程问题/多个进程运行时执行顺序是交叉的多个进程运行时执行顺序是交叉的public class MyThread extends Thread int threadNum;public static void main(String args)MyThread array=new MyThread3;for(int i=0;i3;i+)arrayi=new MyThread(i);for(int i=0;i3;i+
19、)arrayi.start();MyThread(int SerialNum)super();threadNum=SerialNum;public void run()for(int j=0;j5;j+)System.out.println(threadNum+:);trysleep(1000);catch(InterruptedException e);System.out.println(thread+threadNum+bye.);第28页/共66页2023/2/1329如何写多线程1.分别定义不同的线程类,在各自的run方法中定义线程的工作 classmythread1extendsT
20、hreadpublicvoidrun.classmythread2extendsThreadpublicvoidrun.2.在主类中实例化各线程类,并启动线程.publicclassdemoextendsAppletpublicvoidinit()mythreadt1=newmythread1();mythreadt2=newmythread2();t1.start();t2.start();第29页/共66页2023/2/1330练习:将窗口分为上下两个区,分别运行两个线程,一个在上面的区域中显示由右向左游动的字符串,另一个在下面的区域从左向右游动的字符串.方法一:一个线程,在paint方法
21、中使用两个输出字符串的语句publicvoidpaint(Graphicsg)ify1200y2=0elsey2=y2+10;g.drawString(“hello,Java!”,20,y1,);g.drawString(“hello,Java!”,40,y2,);第30页/共66页2023/2/1331方法二:定义两个类,运行各自的线程,各自有自己的paint()方法.注意:两个Applet必须是panel类或者是canvas类,将Applet的区域分成两块,否则不能运行paint语句.第31页/共66页2023/2/1332import javax.swing.*;import java.
22、awt.*;public class Applet1 extends JApplet C t1,t2;myCanvas c1,c2;Container contentPane=getContentPane();public void init()c1=new myCanvas();c2=new myCanvas();contentPane.setLayout(new GridLayout(2,1);contentPane.validate();contentPane.add(c1);contentPane.add(c2);t1=new C(c1,5);t2=new C(c2,-5);t1.st
23、art();t2.start();class myCanvas extends Canvaspublic void paint(Graphics g,int x,int y)g.drawString(Hello World,x,y);class C extends Thread myCanvas a;int steps;int x;C(myCanvas b,int size)a=b;steps=size;x=0;public void run()while(true)x=x+steps;if(xa.getWidth()x=0;a.repaint();a.paint(a.getGraphics(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 多线程学习教程 多线程 学习 教程
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内