菜鸟java学习第五篇 线程
2016-07-23 20:37
561 查看
进程:是一个正在执行中的程序,每一个程序开启都会在内存中分配一片空间,进程就是用来标识这片空间的。
线程:进程中的一个独立的控制单元(执行路径),线程在控制着进程的执行也就是说真正执行的是进程中的线程
多线程:一个进程中有多个线程在同时进行
多线程存在的意义:可以使多部分代码同时执行,提高执行效率
多线程的特点:随机性
Thread类中几个方法:
currentThread();//静态方法,返回是当前正在执行的线程对象
getName();//获取线程的名称
setName();//定义线程的名称 也可在构造方法中传入线程名称
创建线程的方式:
第一种:步骤:1.自定义类继承Thread类。
2.复写Thread类中的run方法
为了将自定义线程需要运行的代码存储进run方法,也就是说run方法中定义的是自定义线程的执行代码
3.调用线程的start方法,开启线程。
Start方法的两个作用:一启动了线程 二调用run方法
Start方法会新建一个线程去执行这个代码
第二各:步骤:1.自定义类去实现Runnable接口
2.实现Runnable接口中的run方法
3.通过Thread类创建线程对象
4.将创建的Runnable接口的子类对象作为参数传递给Thread类的构造函数
因为需要线程去运行run方法中的代码
5.通过start方法开启线程。
第二种的好处:避免了单继承的局限性
多线程存在安全隐患
不安全的原因:当多条语句在操作同一个共享数据时,如果一个线程对多语句只执行了一部分还没有执行完,另一个线程参与进行执行,导致了共享数据的错乱
如何解决安全问题?
同步代码块:格式
synchronized(对象) { //同步代码块
需要被同步的代码
}
同步的前提:1.有两个或两个以上的线程在操作相同的代码
2.必须多个线程使用的是同一个锁。
同步的好处:解决了多线程的安全问题
弊端:线程需要判断,较为消耗资源
查找需要同步的代码块
(需要被多线程执行 操作了共享数据 哪些语句在操作这个共享数据)
同步的两种表现形式:1.同步代码块 2.同步函数 在方法定义时加上synchronized关键字
同步函数的锁是this 也就是它的对象
函数为static时 对象就不是 this
静态同步函数的锁是本类字节码对象,也就是类名.class
同步可能会出现死锁
死锁一般会出现在同步互相嵌套的情况下,而且所持有的锁不同造成的
线程间的通讯:其实就是多个线程在操作同一个资源,但是操作的动作不同。
JDK5.0对多线程进行了升级:将同步synchronized替换成显式的lock操作,将object中的wait,notify,notifyAll替换成了Condition对象(该对象可以用lock中的newCondition方法进行获取)
升级之后好处:一个锁可以绑定多个condition对象
Interrupt方法:让处于冻结状态的线程强制恢复到运行状态,但是会发生interruptedException异常
守护线程:当程序中都是守护线程时,JVM会退出
用 线程名.setDaemon(true);将该线程设置为守护线程。
注意:必须在线程开启前调用
join方法 :等待线程结束,在哪个线程中调用另一个线程的join方法,则该线程需要在另一个线程执行完毕后再执行
yield()方法暂停当前正在执行的线程对象,并执行其他线程
线程最重要的是匿名内部类使用 例子在ThreadTest4.java
线程:进程中的一个独立的控制单元(执行路径),线程在控制着进程的执行也就是说真正执行的是进程中的线程
多线程:一个进程中有多个线程在同时进行
多线程存在的意义:可以使多部分代码同时执行,提高执行效率
多线程的特点:随机性
Thread类中几个方法:
currentThread();//静态方法,返回是当前正在执行的线程对象
getName();//获取线程的名称
setName();//定义线程的名称 也可在构造方法中传入线程名称
创建线程的方式:
第一种:步骤:1.自定义类继承Thread类。
2.复写Thread类中的run方法
为了将自定义线程需要运行的代码存储进run方法,也就是说run方法中定义的是自定义线程的执行代码
3.调用线程的start方法,开启线程。
Start方法的两个作用:一启动了线程 二调用run方法
Start方法会新建一个线程去执行这个代码
第二各:步骤:1.自定义类去实现Runnable接口
2.实现Runnable接口中的run方法
3.通过Thread类创建线程对象
4.将创建的Runnable接口的子类对象作为参数传递给Thread类的构造函数
因为需要线程去运行run方法中的代码
5.通过start方法开启线程。
第二种的好处:避免了单继承的局限性
多线程存在安全隐患
不安全的原因:当多条语句在操作同一个共享数据时,如果一个线程对多语句只执行了一部分还没有执行完,另一个线程参与进行执行,导致了共享数据的错乱
如何解决安全问题?
同步代码块:格式
synchronized(对象) { //同步代码块
需要被同步的代码
}
同步的前提:1.有两个或两个以上的线程在操作相同的代码
2.必须多个线程使用的是同一个锁。
同步的好处:解决了多线程的安全问题
弊端:线程需要判断,较为消耗资源
查找需要同步的代码块
(需要被多线程执行 操作了共享数据 哪些语句在操作这个共享数据)
同步的两种表现形式:1.同步代码块 2.同步函数 在方法定义时加上synchronized关键字
同步函数的锁是this 也就是它的对象
函数为static时 对象就不是 this
静态同步函数的锁是本类字节码对象,也就是类名.class
线程的五种状态: |
同步可能会出现死锁
死锁一般会出现在同步互相嵌套的情况下,而且所持有的锁不同造成的
线程间的通讯:其实就是多个线程在操作同一个资源,但是操作的动作不同。
JDK5.0对多线程进行了升级:将同步synchronized替换成显式的lock操作,将object中的wait,notify,notifyAll替换成了Condition对象(该对象可以用lock中的newCondition方法进行获取)
升级之后好处:一个锁可以绑定多个condition对象
Interrupt方法:让处于冻结状态的线程强制恢复到运行状态,但是会发生interruptedException异常
守护线程:当程序中都是守护线程时,JVM会退出
用 线程名.setDaemon(true);将该线程设置为守护线程。
注意:必须在线程开启前调用
join方法 :等待线程结束,在哪个线程中调用另一个线程的join方法,则该线程需要在另一个线程执行完毕后再执行
yield()方法暂停当前正在执行的线程对象,并执行其他线程
线程最重要的是匿名内部类使用 例子在ThreadTest4.java
package thread; //ThreadTest4.java public class ThreadTest4 { public static void main(String[] args) { new Thread() {<span style="white-space:pre"> </span>//创建匿名内部类 @Override public void run() {<span style="white-space:pre"> </span>//重写Thread类的run()方法 for (int i = 0; i < 50; i++) { System.out.println("bbb" + i); } super.run(); } }.start(); for (int i = 0; i < 50; i++) { System.out.println("aaa" + i); } Runnable runnable=new Runnable() { @Override public void run() { <span style="font-family: Arial, Helvetica, sans-serif;">//重写Thread类的run()方法</span> for (int i = 0; i < 50; i++) { System.out.println("ccc" + i); } } }; new Thread(runnable).start();<span style="white-space:pre"> </span>//开启线程 } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序