java课程实用教程

上传人:c****d 文档编号:243023489 上传时间:2024-09-14 格式:PPT 页数:26 大小:167KB
返回 下载 相关 举报
java课程实用教程_第1页
第1页 / 共26页
java课程实用教程_第2页
第2页 / 共26页
java课程实用教程_第3页
第3页 / 共26页
点击查看更多>>
资源描述
,*,*,第,8,章,Java,的多线程,本章内容,1,线程及其创建,2,线程的调度,3,线程的同步与共享,1,什么是线程?,线程是一个程序内的顺序控制流,使得一个程序具有能够,“,同时,”,执行多个任务的能力。,线程与进程,每个进程都有独立的代码和数据空间,(,进程上下文,),,进程切换的开销大,不同进程间交换数据困难。,线程,:,轻量的进程,同一类线程共享代码和数据空间,线程切换的开销小。,多进程,:,在操作系统中能同时运行多个任务,(,程序,),。,多线程,:,在同一应用程序中有多个顺序流同时执行。,线程可以理解为比进程更小的的程序单元。都具有并发执行多任务的能力,线程包含在进程内。,多线程编程,9/14/2024,2,线程(,Thread,),也称执行上下文(,Execution Context,)包括:,虚拟,CPU,线程体(,Code,),线程数据(,Data,),线程模型,Java,线程模型,代 码,数 据,虚拟,CPU,9/14/2024,3,Java,使用,Thread,类描述线程对象,该类定义在,java.lang,包中。,在创建,Thread,对象的时候,一定要将线程体代码,“,提交,”,给线程对象。这可以从线程类构造器看出来。,Runnable,接口,只要某个对象实现了,Runnable,接口的实现,就可以提交给线程对象。由线程执行该接口中封装的方法:,public void run();,如何创建一个线程?,9/14/2024,4,使用,Runnable,接口,(TestThread2.java),可以将,CPU,,代码和数据分开,形成清晰的模型,;,还可以从其他类继承,;,保持程序风格的一致性。,直接继承,Thread,类,(TestThread1.java),不能再从其他类继承,;,编写简单,可以直接操纵线程,无需使用,Thread.currentThread(),。,两种创建线程方法的比较,9/14/2024,5,直接继承,Thread,类,public class TestThread 1,public static void main (String args),Thread t1 = new MyThread();,t1.start();,class MyThread,extends Thread,public void,run(),for (int i = 0; i5; i+),System.out.print( +i);,System.out.println();,6,使用,Runnable,接口,public class TestThread2 ,public static void main (String args),MyThread myThread = new MyThread(5);,Thread t1 = new Thread(myThread);,t1.start();,class MyThread,implements Runnable,private int n;,public MyThread(int n) this.n = n; ,public void,run(),for (int i = 0; in; i+) System.out.println( +i);,try ,Thread.sleep(500); /,当前正在运行的线程睡,500,毫秒,catch(InterruptedException e),7,两种方法的比较,直接继承,Thread,类,不能再从其他类继承,;,编写简单,可以直接操纵线程,无需使用,Thread.currentThread(),。,使用,Runnable,接口,可以将,CPU,,代码和数据分开,形成清晰的模型,;,还可以从其他类继承,;,保持程序风格的一致性。,若直接,继承,Thread,类,,this,即指当前线程; 若使用,Runnable,接口,要获得当前线程,就必须使用,Thread.currentThread(),方法。,public static Thread currentThread() /,返回对当前正在执行的线程对象的引用。,Example,:,ThreadTester.java,and ThreadTester2.java,8,没有保障的线程,class ThreadTest extends Thread,public void run() ,System.out.println (someting run here,!,);,public void run(String s),System.out.println (string in run is + s);,public static void main (String args) ,ThreadTest tt = new ThreadTest();,tt.start();,tt.run(it wont auto run!);,输出的结果比较有趣:,string in run is it wont auto run!someting run here,!,9,没有保障的线程,一旦调用,start(),方法,必须给,JVM,点时间,让它配置进程。而在它配置完成之前,重载的,run(String s),方法被调用了,结果反而先输出了,“,string in run is it wont auto run!,”,,这时,tt,线程完成了配置,输出了,“,someting run here,!,”,。这个结论是比较容易验证的:修改上面的程序,在,tt.start();,后面加上语句,for (int i = 0; i10000; i+);,这样主线程开始执行运算量比较大的,for,循环了,只有执行完,for,循环才能运行后面的,tt.run(it wont auto run!);,语句。此时,,tt,线程和主线程并行执行了,已经有足够的时间完成线程的配置!因此先到一步!修改后的程序运行结果如下:,someting run here,!,string in run is it wont auto run!,注意:这种输出结果的顺序是没有保障的!不要依赖这种结论!,10,没有保障的线程,class ThreadTest implements Runnable,public void run(),System.out.println (Thread.currentThread().getName();,public static void main (String args) ,ThreadTest tt = new ThreadTest();,Thread ts =new Thread10;,for (int i =0; i 5,就将,a,重设为,0,如果,a5,就,wait,(),进入,Share,对象的等待池。,Adder,:,成员变量,a,不断的累加,1,,如果超过,5,,就调用,notify(),从而使,Reseter,从等待进入锁池,在那里等待获得锁的机会。,CTest.java,23,小结(,1,),线程的创建和启动:,两种创建线程的方式:继承,Thread,类,或者实现,Runnable,接口,用,start(),方法启动,运行时执行,run(),方法中的代码,线程的调度:,在一个线程中,有多个线程处于可运行状态,只有一个线程是实际运行的。,线程的调度不分时,可以通过,sleep(), yield,(),join(),方法,让其他线程获得机会。,24,小结(,2,),线程的同步:,当第一个线程获得了同步的锁,其他的线程进入锁池等待。,线程退出代码块,将释放锁。,锁是以对象为标记的,同一把锁可以封锁多个代码块。,线程的同步控制:,wait(),和,notify,()是在,Object,中定义的。调用应该放在同步代码块中,调用,wait(),线程将释放锁,进入等待池。,调用,notify(),将在等待池中随机挑出一个线程,放入锁池中。,25,作业,多生产者,多消费者问题。三个生产者各产生,1,到,100,之间的随机整数。两个消费者将产生的数输出。,26,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!