多线程(1)
2015-07-02 20:50
141 查看
进程:就是应用程序在内存中分配的空间。(正在运行的程序)
线程:是进程中负责程序执行的执行单元,也称为执行路径。
一个进程中至少有一个线程在负责该进程的运行。
如果一个进程出现了多个线程,就称该程序为多线程程序。
多线程技术:解决多部分代码同时执行的需求,合理的使用cpu资源
多线程的运行根据cpu的切换完成的,怎么切换cpu说的算,
所以多线程运行有一个随机性(cpu的快速切换造成的)
jvm中的多线程。
至少有两个线程:一个是负责自定义代码运行的,这个从main方法开始执行的线程称之为主线程。
一个是负责垃圾回收的。
通过实验,会发现每次结果不一定相同,因为随机性造成的。
而且每一个线程都有运行的代码内容,这个称之为线程的任务。
之所以创建一个线程就是为了去运行制定的任务代码。
而线程的任务都封装在特定的区域中,
比如: 主线程运行的任务都定义在main方法中,垃圾回收线程在收垃圾都会运行finalize方法
** 如何建立一个执行路径呢?
api文档,java.lang.Thread类
该类的描述中有创建线程的两种方式:
** 第一种方式:
1,继承Thread类
2,覆盖run方法
3,创建子类对象就是创建线程对象
4,调用Thread类中的start方法执行线程。并会调用run方法。
start()开启线程后,都会执行run方法。说明run方法中存储的是线程要运行的代码
所以,记住,自定义线程的任务代码都储存在run方法中。
调用start和调用run方法的区别?
调用start会开启线程,让开启的线程去执行run方法中的线程任务。
直接调用run方法,线程并未开启,去执行run方法的只有主线程。
Thread.current.Thread()//当前线程
**创建线程的第二种方式,实现Runnable接口:
1,定义一个类实现Runnable。
2,覆盖Runnable接口中的run方法,将线程要运行的任务代码存储到该方法中。
3,通过Thread类创建线程对象,并将实现了Runnable接口的对象作为Thread类的构造函数的参数进行传递
4,调用Thread类的start方法,开启线程。
实现Runnable接口的好处:
1,避免了继承Thread类单继承的局限性。
2,Runnable接口出现更符合面向对象,将线程进行对象的封装。
3,Runnable接口出现,降低了线程对象和线程任务的耦合性。
所以,以后创建线程都使用第二种方式。
多线程的安全问题:
产生的原因:
1,线程任务中有处理到的共享的数据。
2,线程任务中有多条对共享数据的操作
一个线程在操作共享数据的过程中,其他线程参与了运算,造成了数据的错误。
解决的思想:
只要保证多条操作共享数据的代码在某一时间段,被一条线程所执行 ,
在执行期间不允许其他线程参与运算。
怎么保证?
用到同步代码块。
synchronized(对象(obj))
{
需要被同步的代码
}
同步在目前情况下保证了一次只能有一个线程在执行,其他线程进不来
这就是同步的锁机制
好处:解决了多线程的安全问题
弊端:减低效率。
有可能出现一种情况:
多线程安全问题出现后;加入了同步机制,没有想到,安全问题依旧! 咋办,
这时肯定是同步出了问题
只要遵守了同步的前提,就可以解决。
同步的前提:
多个线程在同步中必须使用同一个锁,这才是对多个线程同步。
进程:就是应用程序在内存中分配的空间。(正在运行的程序)
线程:是进程中负责程序执行的执行单元,也称为执行路径。
一个进程中至少有一个线程在负责该进程的运行。
如果一个进程出现了多个线程,就称该程序为多线程程序。
多线程技术:解决多部分代码同时执行的需求,合理的使用cpu资源
多线程的运行根据cpu的切换完成的,怎么切换cpu说的算,
所以多线程运行有一个随机性(cpu的快速切换造成的)
jvm中的多线程。
至少有两个线程:一个是负责自定义代码运行的,这个从main方法开始执行的线程称之为主线程。
一个是负责垃圾回收的。
通过实验,会发现每次结果不一定相同,因为随机性造成的。
而且每一个线程都有运行的代码内容,这个称之为线程的任务。
之所以创建一个线程就是为了去运行制定的任务代码。
而线程的任务都封装在特定的区域中,
比如: 主线程运行的任务都定义在main方法中,垃圾回收线程在收垃圾都会运行finalize方法
** 如何建立一个执行路径呢?
api文档,java.lang.Thread类
该类的描述中有创建线程的两种方式:
** 第一种方式:
1,继承Thread类
2,覆盖run方法
3,创建子类对象就是创建线程对象
4,调用Thread类中的start方法执行线程。并会调用run方法。
start()开启线程后,都会执行run方法。说明run方法中存储的是线程要运行的代码
所以,记住,自定义线程的任务代码都储存在run方法中。
调用start和调用run方法的区别?
调用start会开启线程,让开启的线程去执行run方法中的线程任务。
直接调用run方法,线程并未开启,去执行run方法的只有主线程。
Thread.current.Thread()//当前线程
**创建线程的第二种方式,实现Runnable接口:
1,定义一个类实现Runnable。
2,覆盖Runnable接口中的run方法,将线程要运行的任务代码存储到该方法中。
3,通过Thread类创建线程对象,并将实现了Runnable接口的对象作为Thread类的构造函数的参数进行传递
4,调用Thread类的start方法,开启线程。
实现Runnable接口的好处:
1,避免了继承Thread类单继承的局限性。
2,Runnable接口出现更符合面向对象,将线程进行对象的封装。
3,Runnable接口出现,降低了线程对象和线程任务的耦合性。
所以,以后创建线程都使用第二种方式。
多线程的安全问题:
产生的原因:
1,线程任务中有处理到的共享的数据。
2,线程任务中有多条对共享数据的操作
一个线程在操作共享数据的过程中,其他线程参与了运算,造成了数据的错误。
解决的思想:
只要保证多条操作共享数据的代码在某一时间段,被一条线程所执行 ,
在执行期间不允许其他线程参与运算。
怎么保证?
用到同步代码块。
synchronized(对象(obj))
{
需要被同步的代码
}
同步在目前情况下保证了一次只能有一个线程在执行,其他线程进不来
这就是同步的锁机制
好处:解决了多线程的安全问题
弊端:减低效率。
有可能出现一种情况:
多线程安全问题出现后;加入了同步机制,没有想到,安全问题依旧! 咋办,
这时肯定是同步出了问题
只要遵守了同步的前提,就可以解决。
同步的前提:
多个线程在同步中必须使用同一个锁,这才是对多个线程同步。
相关文章推荐
- Java中equals和==的区别
- javaSE学习笔记之几个关键字this、super、final、static
- 3.1 坐标系简介
- 图片放大缩小
- 排序算法总结---树形选择排序,堆排序
- 补贴行动背后,火炬租房如何实现“去中介化”?
- 7.2 android volley超时重试设置
- 练习题 (八)
- resin安装配置
- Android初学之------检查前置摄像头是否存在
- 解决ACM异常wt.fc.ObjectNoLongerExistsException
- Java程序设计第十七周之图片的随机显示部分实现
- STM32W108无线ZigBee射频芯片引脚说明(下篇)
- 推荐使用Numba加速Python科学计算
- 发下牢骚(一)
- Hadoop入门系列(3) -- Eclipse+Hadoop开发环境搭建
- Java程序员应该知道的10个eclipse调试技巧
- Android开发常见问题之Handler引起的内存泄漏
- Nexus搭建Maven私服
- Dubbo 架构分析