线程Thread
一、线程:
程序:保存在物理介质(光盘,软盘,硬盘)当中的代码片段
进程:一旦程序运行起来,就变成了操作系统当中的一个进程
线程:程序当中一条独立执行的线索
二、线程的五大状态
新生 就绪 运行 消亡
Born Runnable Running Dead
阻塞
Blocking
三、如何实现线程:
1.extends Thread
@Override
public void run(){}
2.implements Runnable
@Overrible
public void run(){}
3.implements java.util.concurrent.Callable
@Override
public String call()throws Exception{}
四、如何控制线程:
0).setPriority(int); 设置优先级别:可选范围1-10,默认:5
1).static sleep(long); 让当前线程休眠指定的毫秒数[涉及阻塞]
2).static yield(); 让当前线程放弃时间片直接返回就绪
3).join() 一个线程邀请另一个线程优先执行,在被邀请的线程执行结束之前,邀请别人的线程不再执行,一直处于阻塞
*:线程章节所有涉及到阻塞状态的方法,都需要进行异常处理~
*:线程章节所有静态方法,不要关注谁调用方法,只要关注写在谁的线程体~
五、线程中那些可能用到的方法:
1.setName() + getName();设置和得到线程名字
*:让我们通过一个线程类,创建多个不同的线程对象
2.static activeCount() : 得到程序当中所有活跃线程的总数~
*:什么叫活跃线程 :
刚出生不会跑的 不叫活跃
已经死了不能跑的 不叫活跃
其他状态 都算活跃,所以:活跃 = 就绪 + 运行 + 阻塞
3.static currentThread() : 得到正在运行状态的线程对象~
4.setDaemon(true):设置线程成为守护线程
所谓守护线程,就是给其他线程提供服务的线程,
而守护线程最大的特点就是:当程序中只剩下守护线程的时候,守护线程自省结束~
5.interrupt(): 中断 打断线程的阻塞状态
例如:让一个线程去睡一个小时,睡了20分钟后,我后悔了~
六、线程之间的数据共享:
1)使用静态变量

2)使用参数传递:

3)使用内部类

七、并发错误:
多个线程共享数据的时候,很可能出现并发错误
如何解决并发错误~
*:临界资源 = 多个线程共享的数据
*:java给每一个对象都提供了一个标记:
所标记 = 互斥标记 = 互斥锁标记 = 锁旗标 = 监视器 = Monitor
使用synchronized修饰符 = 同步的
1).修饰代码块
synchronized(临界资源){
1st.;
2nd;
erd;
}
*:小括号当中是要加锁的那个对象
代表线程要拿到它的锁标记才能进入大括号当中执行操作
如果拿不到,则进入这个对象的锁池当中阻塞,而离开大括号,需要归还临界资源的所标记,归还锁标记的操作会让锁池当中的线程返回就绪。
2修饰整个方法
public synchronized void add(){
}
等价于
public void add(){
synchronized(this){
}
}
从方法的第一行到最后一行统统进行加锁,对当前对象加锁
*:当synchronized修饰静态方法的时候相当于对 .class 文件进行加锁
*:方法的synchronized特性只有当前类型有效,无法被子类继承得到
*:懒汉式的getter方法必须加synchronized
八、如何解决死锁问题:
*:最靠谱的是线程间相互"通讯"~
Object 类的三个方法:
1)wait():当前线程释放掉自己所有的锁标记和时间片
并且进入调用方法的那个对象的等待池当中
即:如果在 t1 线程当中出现stu.wait(); 就代表t1线程释放所有的锁标记和时间片
并且进入stu对象的等待池当中
2)notify(): 从调用方法的那个对象的等待池当中随机的唤醒一个线程
3)notifyAll():从调用方法的那个对象的等待池当中唤醒所有的线程~
****:这三个方法都必须在已经持有对象的锁标记的前提下才能调用~
否则出现异常
所以它们一定会出现在synchronized(abc){
abc.wait();//abc.notify();
}
九:锁池和线程池的区别:
1)进入的时候 是否需要释放资源?
锁池:不需要释放任何资源
等待池:需要释放所有资源
2)出来的时候 是否需要调用代码
锁池:完全不需要
等待池:必须有另一个线程notify();/notifyAll();
3)出来之后 到哪去了呢?
锁池:直接返回就绪
等待池:直接去锁池
线程Thread的更多相关文章
- Lua 学习笔记(九)协同程序(线程thread)
协同程序与线程thread差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和命令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区别在于,一个具有多个线程的 ...
- java 线程 Thread 使用介绍,包含wait(),notifyAll() 等函数使用介绍
(原创,转载请说明出处!谢谢--http://www.cnblogs.com/linguanh/) 此文目的为了帮助大家较全面.通俗地了解线程 Thread 相关基础知识! 目录: --线程的创建: ...
- Android 线程Thread的2种实现方法
在讲解之前有以下三点要说明: 1.在Android中有两种实现线程Thread的方法: ①扩展java.long.Thread类: ②实现Runnable()接口: 2.Thread类是线程类,它有两 ...
- 线程(thread)
线程(thread): 现代操作系统引入进程概念,为了并发(行)任务 1.进程之间的这种切换代价很高 2.通信方式的代价也很大基本概念: 1.线程是比进程更小的资源单位,它是进程中的一个执行路线(分支 ...
- Java线程Thread的状态解析以及状态转换分析 多线程中篇(七)
线程与操作系统中线程(进程)的概念同根同源,尽管千差万别. 操作系统中有状态以及状态的切换,Java线程中照样也有. State 在Thread类中有内部类 枚举State,用于抽象描述Java线程的 ...
- Asp.Net任务Task和线程Thread
Task是.NET4.0加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread每次实例化都会创建一个新的线程.任务(Task)是架构在线程之上的, ...
- 线程 Thread Runnable 守护线程 join MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Android Framework中的线程Thread及它的threadLoop方法
当初跟踪Camera的代码中的时候一直追到了HAL层,而在Framework中的代码看见了许很多多的Thread.它们普遍的特点就是有一个threadLoop方法.依照字面的意思应该是这个线程能够循环 ...
- Android 线程 thread 两种实现方法
原文链接: http://blog.csdn.net/boyupeng/article/details/6208072 这篇文章中有三点需要提前说明一下, 一: 在android中有两种实现线程thr ...
- 并发基础(六) 线程Thread类的start()和run()
start()和run()方法对于刚接触线程的人来说,会有点混淆,有点难理解,一般都会有以下疑问: 一.start( )方法 1.为什么需要start方法:它的作用是什么: start方法的作用就是将 ...
随机推荐
- lnmp无法删除目录,目录包含.user.ini
无法删除".user.ini"文件解决方法,运行后删除即可 chattr -i /home/wwwroot/yoursite/.user.ini 如果是需要修改文件,记得修改完以后 ...
- Python图片处理
Python图像处理库PIL基本使用 #将图片转换为灰度图像 from PIL import Image pil_im = Image.open('cat.jpg') gray_cat = pil_i ...
- [课程设计]Scrum 1.4 多鱼点餐系统开发进度
Scrum 1.4 多鱼点餐系统开发进度 (点餐页面框架布置) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系 ...
- Thread基本介绍
1.Thread类介绍 Class Thread java.lang.Object java.lang.Thread All Implemented Interfaces: Runnable Dire ...
- SQLServer 自增主键创建, 指定自增主键列值插入数据,插入主键
http://blog.csdn.net/zh2qiang/article/details/5323981 SQLServer 中含自增主键的表,通常不能直接指定ID值插入,可以采用以下方法插入. 1 ...
- iso 培训笔记
protocol协议 + 类方法- 实例方法:继承()方法 <> [] 方法调用 .属性:参数mvc storyboard 资源文件info.plist 权限viewcontroller ...
- 转载:JAVA的静态变量、静态方法、静态类
静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象 ...
- Eclipse关联源码
Eclipse关联源码 1.通常查看jdk的源码 1.悬浮在jdk的某class,右击点击Open Declaration 或F3,则调整其源码.如果没有关联源码,则会弹出: 2.点击“Attach ...
- [Maven] - Eclipse "maven compiler plugin" 冲突解决
刚安装最新的Maven 3.2.5,在eclipse中使用maven的Run As->Maven Install,总会提示: Failed to execute goal org.apache. ...
- mysql数据导出excel格式+乱码解决
1:导出的SQL命令,只需要加上“FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' ” ...