多线程的深入理解
2015-09-30 11:51
190 查看
一、单线程的不足
通过单线程程序的小例子来深入理解线程程序代码:
执行流程:
通过程序运行结果可以看出,主线程创建两个对象,然后调用d1.show()方法,主线程把show方法进栈,执行show方法中的代码,执行完show方法出栈,此时 d2.show()没有被执行,紧接着调用d2.show()方法。
程序执行简图
二、多线程优势以及创建线程的方式
1、多线程实例:
程序代码:程序执行流程:
三个线程在同时执行:主线程、负责执行d1的线程、负责执行d2的线程
程序流程简图:
2、线程的创建方式
1、继承Thread类步骤:
1、继承Thread类
2、覆盖run方法
3、创建子类对象就是创建线程对象
4、调用Thread类中的start方法(启动线程)
例子:
2、实现Runnable接口
步骤:
1、定义一个类实现Runnable接口。
2、覆盖Runnable接口中的run方法,将线程要运行的任务代码封装到该方法中。
3、通过Thread类创建线程对象,并将实现了Runnable接口的类的对象作为Thread类的构造函数的参数进行传递。
4、调用Thread类的start方法,开启线程。
例子:
总结:
1、start()开启线程后,都会执行run方法,说明run方法中存储的是线程要运行的代码。
所以,要记住,自定义线程的任务代码都存储在run方法中。而主线程的代码都放在main方法中。
2、如果不对父类中的run方法进行覆盖,会调用父类中的run方法,父类中的run方法什么也不做,就失去创建线程的意义。
3、实现Runnable接口好处:
1、避免了继承Thread类的单继承的局限性。
2、Runnable接口出现更符合面向对象,将线程任务单独进行对象的封装。
3、Runnable接口的出现,降低了线程对象和线程任务的耦合性。
三、Thread 中的常用方法
start():两件事:1、开启线程 2、调用run方法
getName():返回该线程的名称
currentThread():返回当前正在执行的线程对象,静态方法。Thread.currentThread().getName();
调用start方法和调用run方法的区别(d1.start()和d1.run())-----d1上文中的d1对象
调用start方法会开启线程,让开启的线程去执行run方法中的线程任务。
直接调用run方法,线程并未开启,去执行run方法的只有主线程
四、多线程的内存图
五、
相关文章推荐
- React Native 教程-基础教程
- codeforces 540 E. Infinite Inversions (离散化 + 树状数组)
- 爱上linux(3)-僵尸进程
- altium designer电气符号和包的常用元素
- 四则运算
- eclipse编写C/C++语言
- Web前后分离架构研发模式de演变
- Android正则表达式
- CocoaPods使用教程
- cocoapods安装及使用详解
- ArcGIS教程:填挖方
- 二分查找之美:二分查找及其变体的正确性以及构造方式
- C# 中的ref 和 out
- redis安装、配置、命令
- React Native课程-入门
- OC-1-对象的存储细节、#progma mark指令、NSString类
- iOS拼接json字符串的两种方式
- Java对象初始化详解
- <area> 标签
- Jsp,Servlet,Java中详细获得路径的方法!