《Java程序设计项目案例化教程》课件第8章-多线程 .ppt

上传人(卖家):momomo 文档编号:4325136 上传时间:2022-11-29 格式:PPT 页数:23 大小:355KB
下载 相关 举报
《Java程序设计项目案例化教程》课件第8章-多线程 .ppt_第1页
第1页 / 共23页
《Java程序设计项目案例化教程》课件第8章-多线程 .ppt_第2页
第2页 / 共23页
《Java程序设计项目案例化教程》课件第8章-多线程 .ppt_第3页
第3页 / 共23页
《Java程序设计项目案例化教程》课件第8章-多线程 .ppt_第4页
第4页 / 共23页
《Java程序设计项目案例化教程》课件第8章-多线程 .ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、Java面向对象程序设计第第8章章 多线程多线程教学内容理解什么是多线程掌握多线程的两种实现方法掌握多线程的常用方法理解多线程同步与控制原理进程与线程进程与线程在计算机操作系统中每一个运行的程序被称作一个进程,而每个进程包含多个独立的指令序列,每个指令序列都完成特定的功能,被称为线程。线程也称作轻量级进程。就象进程一样,线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。与分隔的进程相比,进程中的线程之间的隔离程度要小。它们共享内存、文件句柄和其它每个进程应有的状态。进程可以支持多个线程,它们看似同时执行,但互相之间并不同步。一个进程中的多个线程共享

2、相同的内存地址空间,这就意味着它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。多线程是指一个程序能并发完成不同的功能,正是由于这种并发性,使得我们能够在同一台计算机上同时浏览图片欣赏,语言通话等。并发执行指一组在逻辑上互相独立的程序或程序段在执行过程中,其执行时间在客观上互相重叠,即一个程序段的执行尚未结束,另一个程序段的执行已经开始。线程和进程的区别在于每个进程都有独立的代码和数据空间(进程上下文)进程间的切换会有较大的开销;也在于线程可以看成轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。在Java之中,如果要想实现多线程

3、的程序,那么就必须依靠一个线程的主体类(就好比主类的概念一样,表示的是一个线程的主类),这个类可以继承Thread类或实现Runnable接口来完成定义。线程所有完成的功能是通过方法run()来完成,方法run()称为线程体,当一个线程被建立并启动后,程序运行时自动调用run()方法,通过run()方法才能使建立线程的目的得以实现。在Java之中,如果要想实现多线程的程序,那么就必须依靠一个线程的主体类(就好比主类的概念一样,表示的是一个线程的主类),这个类可以继承Thread类或实现Runnable接口来完成定义。线程所有完成的功能是通过方法run()来完成,方法run()称为线程体,当一个

4、线程被建立并启动后,程序运行时自动调用run()方法,通过run()方法才能使建立线程的目的得以实现。线程的实现方式线程的实现方式继承继承Thread类方式类方式java.lang.Thread是一个负责线程操作的类,任何的类只需要继承了Thread类就可以成为一个线程的主类,但是既然是主类必须有它的使用方法,而线程启动的主方法是需要覆写Thread类中的run()方法才可以。使用继承Thread类方式实现多线程:1、创建一个类,该类extends Thread类,并且重写父类的run()方法public class MyThread extends Thread public void ru

5、n()/线程体2、在main()方法中创建线程对象MyThread t=new MyThread();3、再在main()方法中通过线程对象调用start()启动线程t.start();4、启动start()之后,会自动运行run()方法里面的代码。把run()方法里面的代码运行完了,该线程就结束了。【例8-1】:通过案例来掌握继承Thread类方式public class Demo8_01 public static void main(String args)TestThread thread=new TestThread();thread.start();for(inti=0;i10;i

6、+)System.out.print(Main:-+i+);switch(i)case 2:System.out.println();break;case 4:System.out.println();break;case 6:System.out.println();break;case 8:System.out.println();break;class TestThread extends Thread public void run()for(inti=0;i10;i+)System.out.print(Test:+i+);switch(i)case 2:System.out.prin

7、tln();break;case 4:System.out.println();break;case 6:System.out.println();break;case 8:System.out.println();break;该程序的运行结果:实现实现Runnable接口方式接口方式使用Thread类的确是可以方便的进行多线程的实现,但是这种方式最大的缺点就是单继承的问题,为此,在java之中也可以利用Runnable接口来实现多线程,如果要想启动多线程依靠Thread类的start()方法完成,之前继承Thread类的时候可以将此方法直接继承过来使用,但现在实现的是Runable接口,没有

8、这个方法可以继承了,为了解决这个问题,还是需要依靠Thread类完成,在Thread类中定义了一个构造方法:public Thread(Runnable target),接收Runnable接口对象。使用实现Runnable接口方式实现多线程:1、定义一个类实现该接口Runnable接口,并且实现run()方法public class MyRunnable implements Runnablepublic void run()/方法体2、为该类创建一个对象 MyRunnable r=new MyRunnable();3、把该对象传递给线程对象Thread t=new Thread(r);4、

9、通过start()启动线程;t.start();启动线程后,会自动运行run()方法里面的代码。把run()方法里面的代码运行完了,该线程就结束了。【例8-2】:通过案例来掌握继承Runnable类方式public class Demo8_02 public static void main(String args)TestRunnable r=new TestRunnable();Thread t1=new Thread(r);Thread t2=new Thread(r);t1.start();t2.start();class TestRunnable implements Runnabl

10、e public void run()for(inti=0;i10;i+)System.out.print(No.+i+);if(i=4)System.out.println();该程序的运行结果:线程常用方法线程常用方法有时实现多线程的过程中,要满足一些特定要求,如线程的睡眠(暂时停止一段时间执行)和线程等待(让其他线程执行一个时间段后在执行)等,下面是多线程一些常用的方法。表8.1 多线程常用方法方法主要功能setPriority()setPriority()设置线程的优先级。线程的优先级最高为10,优先级最低为1,默认的优先级为5getPriority()getPriority()获取线

11、程的优先级join()join()线程合并,将当前线程与该线程“合并”,即等待该线程结束,再恢复当前线程的运行。让一个线程b“加入”到另一个线程a的尾部,在a执行完毕之前,b线程不能工作yield()yield()让出cpu,当前线程进入就绪队列等待调度wait()wait()当前线程进入对象的wait poolnotify()notify()唤醒等待池wait pool中的一个等待线程notifyAll()notifyAll()唤醒等待池wait pool中的所有等待线程sleep()使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性publ

12、ic static void sleep(long millis)throws InterruptedException,设置的休眠单位是毫秒。线程的休眠指的是让程序的执行速度变慢一些。【例8-3】:通过案例来掌握sleep()方法class MyThread implements Runnable Overridepublic void run()for(int i=0;i 5;i+)try Thread.sleep(100);catch(InterruptedException e)e.printStackTrace();System.out.print(Thread.currentThr

13、ead().getName()+,i=+i+);if(i=1)System.out.println();if(i=3)System.out.println();public class Demo8_03 public static void main(String args)throws Exception MyThread mt=new MyThread();new Thread(mt,线程1).start();new Thread(mt,线程2).start();new Thread(mt,线程3).start();new Thread(mt,线程4).start();new Thread

14、(mt,线程5).start();该程序的运行结果:程序休眠了之后,程序运行速度变慢了。线程线程sleep()Thread类中有一个join()方法,在一个线程中启动另外一个线程的join方法,当前线程将会挂起,而执行被启动的线程,知道被启动的线程执行完毕后,当前 线程才开始执行。【例8-4】:通过案例来掌握join()方法class JoinThread extends Thread public JoinThread(String name)super(name);public void run()for(int i=0;i 5;i+)try Thread.sleep(100);catch

15、(InterruptedException e)e.printStackTrace();System.out.print(Thread.currentThread().getName()+,i=+i+);System.out.println();public class Demo8_04 public static void main(String args)throws Exception for(int i=1;i=5;i+)JoinThread t1=new JoinThread(线程+i);t1.start();try t1.join();catch(InterruptedExcept

16、ion e)该程序的运行结果:线程线程join()线程线程yield()yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。【例8-5】:通过案例来掌握yield()方法public class Demo8_05 public static void main(String args)YieldThread t1=new YieldThread(t1);YieldThread t2=new YieldThread(

17、t2);t1.start();t2.start();class YieldThread extendsThread YieldThread(String s)super(s);public void run()for(int i=1;i=10;i+)System.out.print(getName()+:+i+);if(i%2=0)yield();System.out.println();该程序的运行结果:线程优先级线程优先级从理论上讲,线程的优先级越高,越有可能先执行。如果要想操作线程的优先级有两个方法,如表8.2所示:表8.2 线程的优先级方法发现设置和取得优先级的时候都是利用了一个int

18、型数据的操作,而这个int型数据有三种取值:表8.3线程优先级静态量方法主要功能public final void setPriority(int newPriority)设置线程的优先级public final int getPriority()取得线程的优先级字段主要功能public static final int MAX_PRIORITY最高优先级10public static final int NORM_PRIORITY中等优先级5public static final int MIN_PRIORITY最低优先级18.3.1 Collection接口(续)接口(续)方法名称方法名称

19、含义含义public boolean add(Object o)将对象添加到集合中将对象添加到集合中public boolean contains(Object o)查找集合中是否含有对象查找集合中是否含有对象opublic boolean equals(Object o)判断集合是否等价判断集合是否等价public Iterator iterator()返回一个迭代器,用来访问集合中的元素返回一个迭代器,用来访问集合中的元素public boolean remove(Object o)删除集合中的对象删除集合中的对象opublic int size()返回集合中元素的个数返回集合中元素的个数

20、public Object toArray()以数组的形式返回集合中的元素以数组的形式返回集合中的元素【例8-5】:通过案例来掌握线程优先级class PriorityThread implements Runnable static int num=0;public void run()for(int x=0;x 10;x+)try Thread.sleep(1000);catch(InterruptedException e)e.printStackTrace();System.out.print(Thread.currentThread().getName()+,x=+x+);num+;

21、if(num=3)num=0;System.out.println();public class Demo8_07 public static void main(String args)throws Exception PriorityThread mt=new PriorityThread();Thread t1=new Thread(mt,线程1);Thread t2=new Thread(mt,线程2);Thread t3=new Thread(mt,线程3);t3.setPriority(Thread.MAX_PRIORITY);t1.setPriority(Thread.MIN_P

22、RIORITY);t2.setPriority(Thread.NORM_PRIORITY);t1.start();t2.start();t3.start();该程序的运行结果:线程的同步机制线程的同步机制线程是一份独立运行的程序,有自己的专用的运行栈,线程有可能和其他线程共享一些资源,比如:内存、文件、数据库等。当多个线程同时读写同一份共享可变资源的时候,可能会引起冲突,这时候就引入线程同步机制,即各线程之间要有个先来后到,不能一窝蜂挤上去抢资源。线程同步和字面意思恰好相反,线程同步就是线程排队,采用同步机制,对可变共享资源进行排队分配。程序中当多个线程访问共享资源的代码,有可能是同一份代码,

23、也有可能是不同的代码,无论是否执行同一份代码,只要这些线程的代码访问同一份可变的共享资源,这些线程之间就需要同步。线程同步具有以下特点:1、只有共享资源的读写访问才需要同步,如果不是共享资源,那么就根本没有同步的必要。2、只有变量才需要同步访问,如果共享的资源是固定不变的,那么就相当于“常量”,线程同时读常量也不需要同步,至少一个线程修改共享资源,这样的情况下,线程之间需要同步。3、Java程序中实现线程同步,采用互斥锁标记,保证在任一时刻,只能有一个线程访问该对象。用synchronized关键字来实现线程同步,Java使用synchronized来同步代码块和方法。(1)在一个方法中,用s

24、ynchronized声明的语句块称为同步代码块,同步代码块的语法形式如下:Synchronized(synObject)/需同步的代码块Synchronized块是这样的一个代码块,其中的代码必须获得对象synObject的锁方能执行,当一个线程欲进入该对象的关键代码时,jvm将检查该对象的锁是否被其他线程获得,如果没有,则jvm将把该对象的锁交给当前请求锁的线程,该线程获得锁后就可以进入关键代码区域。(2)用synchronized声明的方法,称为同步方法Synchronized 限定修饰符 static 方法返回值 方法名(形参)/需同步的代码Synchronized关键字修饰的方法,叫

25、同步方法,在同一时间内,一个方法只能有一个线程运行。【例8-7】:利用同步语句块实现两个线程输出0-10的值public class Demo8_07 implements Runnablepublic static void main(String args)Demo8_07 t1=new Demo8_07();Thread ta=new Thread(t1,A);Thread tb=new Thread(t1,B);ta.start();tb.start();public void run()synchronized(this)for(int i=0;i=10;i+)System.out.

26、print(Thread.currentThread().getName()+i);System.out.println();该程序的运行结果:任务总结任务总结本章我们主要学习了什么是进程和什么是线程,线程的实现方法和线程的常用方法,以及线程的优先级和线程的同步与控制。在计算机操作系统中每一个运行的程序被称作一个进程,而每个进程包含多个独立的指令序列,每个指令序列都完成特定的功能,被称为线程。线程的实现通过创建一个类,该类extends Thread类和定义一个类实现Runnable接口。线程的常用方法用线程睡眠sleep(),线程堵塞join(),线程等待yield()等。线程优先级:从理论

27、上讲,线程的优先级越高,越有可能先执行。当多个线程同时读写同一份共享资源的时候,可能会引起冲突,这时候就引入线程同步机制,即各线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。1.可以导致线程不能运行,是()。A等待B阻塞C休眠D挂起及由于I/O操作而阻塞2.当()方法终止时,能使线程进入死亡状态。ArunBsetProrityCyieldDsleep 3.用()方法可以改变线程的优先级。ArunBsetProrityCyieldDsleep10.6任务练习任务练习4.有以下代码public class Example implements Runnable public void run()

28、while(true)public static void main(String args)Example ex1=new Example();Example ex2=new Example();Example ex3=new Example();ex1.run();ex2.run();ex3.run();下面说话正确的是()。A.代码编译失败,因为ex2.run()无法获得执行B.代码编译成功,存在3 个可运行的线程C.代码编译成功,存在1 个可运行的线程5.有以下代码class Example implements Runnable public static void main(Str

29、ing args)Thread t=new Thread(new Example();t.start();public void run(int limit)for(int x=0;xlimit;x+)System.out.println(x);下面说话正确的是()。A.打印输出,从0 至limitB.无内容输出,因为没有明确调用run()方法。C.代码编译失败,因为没有正确实现Runnable 接口D.代码编译失败,如果声明类为抽象类,可使代码编译成功。E.代码编译失败,如果去掉implements Runnable,可使代码编译成功。6.有如下代码class Example public

30、static void main(String args)Thread.sleep(3000);System.out.println(“sleep”);下面说话正确的是()。A.编译出错B.运行时异常C.正常编译运行,输出sleepD.正常编译运行,但没有内容输出7.开辟两个线程,一个线程来实现对一个整型数组进行排序(冒泡排序),一个线程实现输出1-1000之间的偶数值。8.在程序中随即产生10个整数,创建两个线程并发执行排序操作,分别实现对这10个整数进行冒泡排序和直接插入排序,输出排序的结果,并比较这两种排序算法的优劣。9.编写一个多线程类,该类的构造方法调用Thread类带字符串参数的构造方法,建立自己的线程名,然后随机生成一个休眠时间,再设置自己的线程名和休眠后的显示时间。该线程运行后,休眠一段时间,该时间就是在构造方法中生成的时间。最后编写一个测试类,创建多个不同名字的线程,并测试其运行情况

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《Java程序设计项目案例化教程》课件第8章-多线程 .ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|