Java并行程序基础
有关线程
进程是计算机中的程序关于某数据集合上的一次运动活动,是系统进行资源分配的基础单位。进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程的生命周期
线程的所有状态都在Thread的State枚举中
public enum State {/*** 表示刚刚创建的线程,这种线程还没开始执行。**/NEW,/*** 调用start()方法后,线程开始执行,处于RUNNABLE状态,* 表示线程所需要的一切资源以及准备好。**/RUNNABLE,/*** 当线程遇到synchronized同步块,就进入了BLOCKED阻塞状态。* 这时线程会暂停执行,直到获得请求的锁。**/BLOCKED,/*** WAITING和TIMED_WAITING都表示等待状态,他们是区别是WAITING表示进入一个无时间限制的等待* TIMED_WAITING会进入一个有时间限制的等待。* WAITING的状态正是在等待特殊的事件,如notify()方法。而通过join()方法等待的线程,则是等待目标线程的终止。* 一旦等到期望的时间,线程就会继续执行,进入RUNNABLE状态。* 当线程执行完后进入TERMINATED状态,表示线程执行结束。**/WAITING,TIMED_WAITING,TERMINATED;
线程的基本操作
新建线程
新建线程很简单,使用new创建一个线程对象,并将它start()。
Thread t1 = new Thread();
t1.start();
start()方法会创建一个新线程,并执行run()方法。
注意:不要使用run()来开启线程。它只会在当前线程中,串行执行run()方法。
让线程执行指定逻辑,需要重载Thread的run()方法。
Thread t1 =new Thread(){
@Override
public void run()
{...
}
};
t1.start();
也可以使用Runnable接口来实现相同操作。
public class A implements Runnable{@Override
public void run()
{
....
}
}#把Runnable的实例作为参数传入线程
Thread t1 = new Thread(new A());
t1.start();
终止线程
废弃的方法:stop()。
此方法太粗暴,会直接终止线程,并且立即释放线程持有的锁,破坏数据的一致性。
线程中断
线程中断并不会使线程立即退出,而是给线程发一个通知,告诉目标线程停止执行,至于目标线程接到通知后怎么处理,由线程自行决定。
线程中断相关的3个方法:
//Thread.interrupt() 是一个实例方法,他通知目标线程中断,也就是设置中断标志位。中断标志位表示当前线程已经被中断了。
public void Thread.interrupt() ;//Thread.isInterrupted() 也是实例方法,他判断当前线程是否被中断(通过检查中断标志位)
public boolean Thread.isInterrupted(); //Thread.interrupted() 是静态方法,判断当前线程的中断状态,但同时会清除当前线程的中断标志位状态。
public static boolean Thread.interrupted() ;
示例1:
public class InterruptExample {public static void main(String [] a){Thread t1 = new Thread("线程小哥 - 1 "){@Overridepublic void run() {while (true){/*** 必须得判断是否接受到中断通知,如果不写退出方法,也无法将当前线程退出.*/if (Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName() + " Interrupted ... ");break;}Thread.yield();}}};t1.start();try {Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}/*** 给目标线程发送中断通知* 目标线程中必须有处理中断通知的代码* 否则,就算发送了通知,目标线程也无法停止.*/t1.interrupt();}
}
示例2:
public class InterruptExample {public static void main(String [] a){Thread t1 = new Thread("线程小哥 - 1 "){@Overridepublic void run() {while (true){/*** 必须得判断是否接受到中断通知,如果不写退出方法,也无法将当前线程退出.*/if (Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName() + " Interrupted ... ");break;}try {/*** 处理业务逻辑花费10秒.* 而在这时,主线程发送了中断通知,当线程在sleep的时候如果收到中断* 则会抛出InterruptedException,如果在异常中不处理,则线程不会中断.**/Thread.sleep(10000);} catch (InterruptedException e) {System.out.println("我错了....");/*** 在sleep过程中,收到中断通知,抛出异常.可以直接退出线程.* 但如果还需要处理其他业务,则需要重新中断自己.设置中断标记位.* 这样在下次循环的时候 线程发现中断通知,才能正确的退出.*/Thread.currentThread().interrupt();}Thread.yield();}}};t1.start();try {/*** 处理业务500毫秒* 然后发送中断通知,此时t1线程还在sleep中.*/Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}/*** 给目标线程发送中断通知* 目标线程中必须有处理中断通知的代码* 否则,就算发送了通知,目标线程也无法停止.*/t1.interrupt();}
}
注意:
Thread.sleep()方法由于中断而抛出异常,此时,它会清除中断标志,如果不加处理,则捕获不到这个中断,故在异常处理中,再此设置中断标志。
等待(wait)和通知(notify)
Java并行程序基础相关推荐
- shadowplay要下载java_Java并发程序设计(二)Java并行程序基础
Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师 链接:https://www.zhihu.com/question/27654579/answer/ ...
- Java并发程序设计(二)Java并行程序基础
Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师 链接:https://www.zhihu.com/question/27654579/answer/ ...
- (二)Java并行程序基础
Java并行程序基础 2.1 线程和进程 2.2 初始线程 2.2.1 新建线程 2.2.2 线程中断 2.2.3 等待(wait)和通知(notify) 2.2.4 挂起(suspend)和继续执行 ...
- Java并行程序基础(十二)
2019独角兽企业重金招聘Python工程师标准>>> 无锁 对于并发控制而言,锁是一种悲观策略.它总是假设每一次的临界区操作会产生冲突,因此,必须对每次操作都小心翼翼.如果多个线程 ...
- 《Java高并发程序设计》读书笔记 第二章 并行程序基础
- Java面向对象程序基础设计之第三章
3.1.1 自定义包 如果在程序中没有声明包,类将被存放在default的包中,该方式不被提倡. 语法: package 包名 包命名规范: 包的命名规范应当体现出项目资源良好的划分 自定义标签类所在 ...
- java面向对象程序基础实验_20165115 实验二《Java面向对象程序设计》实验报告
20165115 实验二 面向对象程序设计 这一次的实验,老师按照实验内容的不同将实验分成了五个部分进行.五个部分的侧重难易都有区别,实验报告中的叙述也会有所区别. 第一部分 先上实验结果截图: 这一 ...
- Spring Boot –现代Java应用程序的基础
Spring Boot是Spring.io中一个相对较新的项目. 其目的是简化创建新的基于Spring Framework的项目,并通过应用一些约定来统一其配置. 这种关于配置的方法约定已经成功地应用 ...
- java负数右移_收入囊中篇---Java程序基础(二)
前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...
最新文章
- 5 个关于 API 中日期和时间设计规则
- 关于NandFlash在实际产品使用上的一些经验
- 微服务架构与领域驱动设计应用实践
- 百度全面开放HTTPS之我见
- jsp里照片放在哪里_杭州这所新学校今天办了场热闹的“电影节”,校园里处处高科技,黑板一秒变电脑屏幕...
- 最新 955 不加班公司名单
- 信息学奥赛一本通 1017:浮点型数据类型存储空间大小 | OpenJudge NOI 1.2 02
- qt添加qwt帮助文件_qt creator中使用qwt插件
- 警告:MySQL-server-5.6.26-1.el7.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
- Ubuntu下如何安装Dynamips
- 双击鼠标触发了Ctrl+C事件
- 13个免费的开源GIS软件
- python生成三维点云包围盒
- 幻灯片JavaScript特效展示
- eBay月入五万以上大卖家请进,解决你的提现和结汇问题!
- 从.weights中提取权重数据
- 单片机开发不可避免会遇到很多头疼的问题
- 六星经典CSAPP笔记(2)信息的操作和表示
- NAND FLAASH基础
- [转] R 解读逻辑回归结果:回归系数,OR
热门文章
- RVDS4.0上开发cortex A8 NEON程序
- nginx教程全集汇总(ttlsa出品)
- 《跟菜鸟学Cisco UC部署实战》-第 0 章 宣传-课件(一共12章,免费)
- codeforces VK Cup 2018 - Wild-card Round 1 (unofficial unrated mirror)
- java-第九章-编写程序,打印如图案,要求图案的行数由用户输入.
- MySQL的root默认密码修改
- dhcp服务配置文件/etc/dhcpd.conf详解
- Happy Birthday
- Python才排第8名!2018增速最快TOP 10编程语言盘点
- MySQL sql99语法—非等值连接