2016032802_多线程的实现剖析

上传人:今*** 文档编号:105911513 上传时间:2019-10-14 格式:DOC 页数:9 大小:1.26MB
返回 下载 相关 举报
2016032802_多线程的实现剖析_第1页
第1页 / 共9页
2016032802_多线程的实现剖析_第2页
第2页 / 共9页
2016032802_多线程的实现剖析_第3页
第3页 / 共9页
2016032802_多线程的实现剖析_第4页
第4页 / 共9页
2016032802_多线程的实现剖析_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《2016032802_多线程的实现剖析》由会员分享,可在线阅读,更多相关《2016032802_多线程的实现剖析(9页珍藏版)》请在金锄头文库上搜索。

1、1、课程名称:多线程的实现2、知识点2.1、上次课程的主要知识点进程与线程的区别2.2、本次预计讲解的知识点实现Java的多线程操作。3、具体内容()在Java中对于多线程实现一定要有一个线程的主类,而这个线程的主类往往是需要操作一些资源。但是对于这个多线程主类的实现是有一定要求: 继承Thread父类; 实现Runnable接口(Callable接口)。3.1、继承Thread类实现多线程在java.lang包中存在有Thread类,子类继承Thread类之后需要覆写Thread类中的run()方法,那么这个方法就属于线程的主方法,定义:public void run()。范例:实现线程的主

2、体类class MyThread extends Thread / 表示实现多线程private String name ;public MyThread(String name) / 线程名字this.name = name ;Overridepublic void run() / 覆写run()方法,线程的主方法for (int x = 0; x 10; x+) System.out.println(this.name + ,x = + x);在线程的主类之中只是将内容输出10次。但是需要注意的是:所有的多线程的执行一定是并发完成的,即:在同一个时间段上会有多个线程交替执行,所以为了达到这

3、样的目的,绝对不能够直接去调用run()方法,而是应该调用Thread类中的start()方法启动多线程:public void start().范例:启动多线程public class TestDemo public static void main(String args) MyThread mt1 = new MyThread(线程A) ;MyThread mt2 = new MyThread(线程B) ;MyThread mt3 = new MyThread(线程C) ;mt1.start(); mt2.start(); mt3.start(); 所有的线程都属于交替执行,本身是没有固

4、定的执行顺序的。思考:为什么现在启动多线程不使用run()方法,而非要使用start()方法?为了方便解释此问题,必须打开Thread类中的start()源代码来观察(E:Javajdk1.8.0_74src.zip)。public synchronized void start() if (threadStatus != 0)throw new IllegalThreadStateException();group.add(this);boolean started = false;try start0();started = true; finally try if (!started)

5、group.threadStartFailed(this); catch (Throwable ignore) private native void start0();现在的代码之中首先可以发现,方法会抛出一个异常:“IllegalThreadStateException”,但是整个方法里面没有使用throws声明,没有使用try.catch捕获处理,而之所以会出现这样的情况是因为此异常属于RuntimeException的子类。java.lang.Object |- java.lang.Throwable |- java.lang.Exception |- java.lang.Runtim

6、eException |- java.lang.IllegalArgumentException |- java.lang.IllegalThreadStateException此异常指的是一个线程已经调用了start()方法后又重复执行了start()方法所造成的问题。在调用start()方法里面发现会调用start0()方法,而start0()方法上使用了native关键字定义,这个关键字指的是要调研那个本机的操作系统函数。由于线程的启动需要牵扯到操作系统中资源的分配问题,所以具体的线程的启动应该要根据不同的操作系统有不同的实现,而JVM相当于根据系统中定义的start0()方法来根据不同

7、的操作系统进行该方法的实现,这样在多线程的层次上start0()方法名称不改变。而不同的操作系统上有不同的实现。结论:只有Thread类的start()方法才能够进行操作系统资源的分配,所以启动多线程的方式永远就是调用Thread类的start()方法实现。3.2、实现Runnable接口继承Thread类会产生单继承的局限操作,所以现在最好的做法是利用接口来解决问题,于是就可以使用Runnable接口来完成操作。首先来观察一下Runnable接口的定义结构:FunctionalInterfacepublic interface Runnable public void run() ;此时的代

8、码使用的是函数式的接口,可以利用Lamda表达式完成。范例:按照正常思路实现多线程class MyThread implements Runnable / 表示实现多线程private String name ;public MyThread(String name) / 线程名字this.name = name ;Overridepublic void run() / 覆写run()方法,线程的主方法for (int x = 0; x 10; x+) System.out.println(this.name + ,x = + x);如果要想启动多线程依靠只能够是Thread类中的start(

9、)方法,在之前继承Thread类的时候可以直接将start()方法继承下来继续使用,但是现在实现的是Runnable接口,所以此方法没有了。于是来观察Thread类中的构造方法:public Thread(Runnable target)。public class TestDemo public static void main(String args) MyThread mt1 = new MyThread(线程A) ;MyThread mt2 = new MyThread(线程B) ;MyThread mt3 = new MyThread(线程C) ;new Thread(mt1).sta

10、rt();new Thread(mt2).start();new Thread(mt3).start(); 很多时候为了方便实现,可能直接使用匿名内部类或者是Lamda实现代码。范例:观察实现public class TestDemo public static void main(String args) String name = 线程对象 ; new Thread(new Runnable() Overridepublic void run() for (int x = 0; x for (int x = 0; x 10; x+) System.out.println(name + ,x

11、 = + x);).start(); 只要给出的是函数式接口基本上就都可以使用Lamda表达式或者是方法引用。3.3、两种实现方式的区别(面试题)对于多线程的两种实现模式:继承Thread类、实现Runnable接口,那么这两种模式本质上来讲,一定使用Runnable接口实现,这样可以避免单继承局限,但是除了这样的使用原则之外,还需要清楚这两种实现方式的联系。首先来观察Thread类的定义结构;public class Thread extends Object implements Runnable可以发现Thread类实现了Runnable接口。通过类图描述关系可以发现,整个代码的操作中使

12、用的就是一个代理设计模式的结构,但是与传统的代理设计还有些差别。如果按照传统代理设计模式来讲,现在如果要想启动多线程理论应该是run()方法,但是实质上现在调用的是start()名称不符合,之所以会这样主要是因为长期发展后的产物,最早的时候设计模式就是个梦。除了以上的继承关联之外还有一点区别:Runnable接口实现的多线程要比Thread类实现的多线程更方便的表示出数据共享的概念。范例:希望有三个线程进行卖票 Thread实现package cn.mldn.demo;class MyThread extends Thread / 表示实现多线程private int ticket = 5 ;

13、Overridepublic void run() / 覆写run()方法,线程的主方法for (int x = 0; x 0) System.out.println(卖票,ticket = + this.ticket -);public class TestDemo public static void main(String args) MyThread mt1 = new MyThread() ;MyThread mt2 = new MyThread() ;MyThread mt3 = new MyThread() ;mt1.start();mt2.start();mt3.start();卖票,ticket = 5卖票,ticket = 4卖票,ticket = 3卖票,ticket = 2卖票,ticket = 1卖票,ticket = 5卖票,ticket = 4卖票,ticket = 3卖票,ticket = 2卖票,ticket = 1卖票,ticket = 5

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号