java丐帮_java多线程学习笔记(二)
上一节讲到多线程的创建,两种创建方式一种继承Thread类,一种实现Runnable接口;
常用的多线程函数:
currentThread()方法 返回代码段正在被哪个线程调用的信息
isAlive()方法 判断当前线程是否处于活动状态(线程正在运行或准备开始运行的状态)
sleep()方法 让正在执行的线程休眠(停止执行),这个进程指的是this.currentThread返回的线程
getId()方法 取得线程的唯一标识
yield()方法 暂时放弃cpu资源,将cpu资源让给其他程序,但是放弃的时间不确定,可能刚放弃马上又执行
interrupt()方法 在当前线程中打一个停止标记,不会停止线程
interrupted()方法 测试当前线程是否已经中断,如果已经中断,则将状态标志清除,并设置为false。(线程的中断状态由该方法清除)
isInterrupted()方法 测试线程是否已经中断,但不清除状态标志
setPriority()方法 设置线程的优先级,java中线程优先级分为1-10级,线程的优先级具有继承性。高优先级的线程总是大部分先完成。
既然有创建线程的方法,肯定有停止线程的方法,停止线程的方法主要有3种:
使用退出标志,使线程正常退出,也就是run()方法完成时,线程停止
使用stop方法强行停止线程,但是这个是已经作废的方法,现在不再使用了
使用interrupt方法中断线程
总结写在前面:停止线程的方法最好用的1.break return 跳出 2.try catch跳出
1.使用退出标志
和前面的方法6,7,8的描述一样,退出标志并不能使线程停止,只是给线程打上了一个停止标志,7,8是检查停止标志的方法。
2.使用stop方法强行停止线程
方法已作废,不做讨论
3.interrupt方法中断线程
PlanA---通过
if(this.interrupted()){
System.out.println("已经是停止状态了,我要退出了!");break;
}
使用 if 结合 break 来中断线程,但是他不能干净得结束run方法,因为break仅仅是跳出循环的操作,如果run()方法除了for循环后面还有别的操作,代码是会仅仅跳出for循环而继续执行后面的代码的。
PlanB---通过
try{for(int I = 0;I < 5000 ; I++){if(this.interrupted()){
System.out.println("Out!");throw newInterruptedException();
}
}
}catch(InterruptedException e){
System.out.println("End");
e.printStackTrace();
}
try-catch 可以通过捕获一场的方式,将整个run()方法放进 try 代码块,通过捕获 interrupt 的状态标志来抛出异常,跳出线程,达到终止线程的目的。
PlanC--通过
if(this.interrupted()){
System.out.println("Is End!");return;
}
通过使用 return 也可以跳出线程
但是通常建议使用抛异常的方式来实现线程的停止,因为在catch块中还可以将异常上抛,使线程停止的事件得以传播。
本节开始涉及到线程安全的问题,因为线程轮流占有CPU运行,当多个线程同时对一个变量进行操作是,会产生脏读的现象。
百度上的脏读是:脏读就是指当一个事物正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。------ 多线程下的对数据的操作也会出现同样的场景。(值被更改,值不同步)
为了避免出现以上的现象,多线程会引入 互斥区/临界区 的概念,通过对需要保护的数据(类/对象/方法)加锁,实现互斥的效果,达到线程的安全。
java多线程加锁,主要是通过synchronized关键字与volatile关键字,在下一节里详细写。
java丐帮_java多线程学习笔记(二)相关推荐
- java丐帮_Java多线程学习笔记(一)
一.什么是多线程 首先是多线程的概念: 多线程是异步的,和单任务不同,并不一定按照代码的执行顺序(上图左)来运行,而是交错占用CPU运行(上图右): 二.如何使用多线程 JAVA多线程有两种实现方式: ...
- java丐帮_java多线程学习笔记(五)
补充一个synchronized关键字的结论: 线程A先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法 A线程现持有object对 ...
- java丐帮_java多线程学习笔记(三)
java多线程下的对象及变量的并发访问 上一节讲到,并发访问的时候,因为是多线程,变量如果不加锁的话,会出现"脏读"的现象,这个时候需要"临界区"的出现去解决多 ...
- java丐帮_java多线程学习笔记(四)
上一节讲到Synchronized关键字,synchronized上锁的区域:对象锁=方法锁/类锁 本节补充介绍一下synchronized锁重入: 关键字synchronized拥有锁重入的功能,也 ...
- java丐帮_java多线程学习笔记(八)
本节开始线程间通信: 使用wait/notify实现线程间通信 生产者/消费者模式的实现 方法join的使用 ThreadLocal类的使用 可以通过使用 sleep() 结合 while(true) ...
- java丐帮_java多线程学习笔记(六)
本节开始synchronized关键字的最后一部分内容: 静态同步方法synchronized方法与synchronized(class)代码块 关键字synchronized还可以用在static静 ...
- java 编程思想 多线程学习笔记
java 编程思想 多线程学习笔记 一.如何创建多线程? 1.继承 java.lang.Thread 类 2.实现 java.lang.Runnable 接口 3.Callable接口 总之,在任何线 ...
- java线程集合点_Java多线程学习笔记(三) 甚欢篇
使人有乍交之欢,不若使其无久处之厌 <小窗幽记>很多时候,我们需要的都不是再多一个线程,我们需要的线程是许多个,我们需要让他们配合.同时我们还有一个愿望就是复用线程,就是将线程当做一个工人 ...
- java 指针_java多线程学习二十二:::java中的指针
在上面那个图,我们看到一个特殊的变量unsafe,它的包名是 sun.misc.Unsafe;从名字看,这个类应该是封装一些不安全的操作,为什么不安全?对c语言理解的朋友就知道了,指针是不安全的,在j ...
最新文章
- 用Swift实现一款天气预报APP(三)
- Nat. Mach. Intel. | IBM RXN: 深度学习在化学反应分类上大放异彩
- automation服务器不能创建对象的问题
- python五十七:str与repr,类似于 java对象中的tostring()方法
- 抓个Firefox的小辫子,围观群众有:Chrome、Edge、IE8-11
- object - c 函数的值
- 个人材料(上报公司)
- 小K的农场(差分约束)
- django 1.8 官方文档翻译: 3-1-3 Django 的快捷函数
- Android开发笔记(八十二)SDK版本兼容
- jenkins配置记录(1)--添加用户权限
- opencv在linux设置环境变量,linux下设置opencv环境变量
- 从U盘安装windows/linux操作系统
- js时间戳写入mysql
- Python 并发简介(多线程、多进程)
- r语言调用python_R语言与Python协同工作
- Dell笔记本外接显示器—显示器模糊、字体不清晰
- K_A19_002 基于STM32等单片机采集水位检测传感数据 串口与OLED0.96双显示
- c语言 北京时间转换utc时间_UTC时间转换成北京时间C语言函数代码
- 浅析RGB 及RGB转换为ARGB