有关线程

进程是计算机中的程序关于某数据集合上的一次运动活动,是系统进行资源分配的基础单位。进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

线程的生命周期


线程的所有状态都在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并行程序基础相关推荐

  1. shadowplay要下载java_Java并发程序设计(二)Java并行程序基础

    Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师 链接:https://www.zhihu.com/question/27654579/answer/ ...

  2. Java并发程序设计(二)Java并行程序基础

    Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师 链接:https://www.zhihu.com/question/27654579/answer/ ...

  3. (二)Java并行程序基础

    Java并行程序基础 2.1 线程和进程 2.2 初始线程 2.2.1 新建线程 2.2.2 线程中断 2.2.3 等待(wait)和通知(notify) 2.2.4 挂起(suspend)和继续执行 ...

  4. Java并行程序基础(十二)

    2019独角兽企业重金招聘Python工程师标准>>> 无锁 对于并发控制而言,锁是一种悲观策略.它总是假设每一次的临界区操作会产生冲突,因此,必须对每次操作都小心翼翼.如果多个线程 ...

  5. 《Java高并发程序设计》读书笔记 第二章 并行程序基础

  6. Java面向对象程序基础设计之第三章

    3.1.1 自定义包 如果在程序中没有声明包,类将被存放在default的包中,该方式不被提倡. 语法: package 包名 包命名规范: 包的命名规范应当体现出项目资源良好的划分 自定义标签类所在 ...

  7. java面向对象程序基础实验_20165115 实验二《Java面向对象程序设计》实验报告

    20165115 实验二 面向对象程序设计 这一次的实验,老师按照实验内容的不同将实验分成了五个部分进行.五个部分的侧重难易都有区别,实验报告中的叙述也会有所区别. 第一部分 先上实验结果截图: 这一 ...

  8. Spring Boot –现代Java应用程序的基础

    Spring Boot是Spring.io中一个相对较新的项目. 其目的是简化创建新的基于Spring Framework的项目,并通过应用一些约定来统一其配置. 这种关于配置的方法约定已经成功地应用 ...

  9. java负数右移_收入囊中篇---Java程序基础(二)

    前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...

最新文章

  1. 5 个关于 API 中日期和时间设计规则
  2. 关于NandFlash在实际产品使用上的一些经验
  3. 微服务架构与领域驱动设计应用实践
  4. 百度全面开放HTTPS之我见
  5. jsp里照片放在哪里_杭州这所新学校今天办了场热闹的“电影节”,校园里处处高科技,黑板一秒变电脑屏幕...
  6. 最新 955 不加班公司名单
  7. 信息学奥赛一本通 1017:浮点型数据类型存储空间大小 | OpenJudge NOI 1.2 02
  8. qt添加qwt帮助文件_qt creator中使用qwt插件
  9. 警告:MySQL-server-5.6.26-1.el7.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
  10. Ubuntu下如何安装Dynamips
  11. 双击鼠标触发了Ctrl+C事件
  12. 13个免费的开源GIS软件
  13. python生成三维点云包围盒
  14. 幻灯片JavaScript特效展示
  15. eBay月入五万以上大卖家请进,解决你的提现和结汇问题!
  16. 从.weights中提取权重数据
  17. 单片机开发不可避免会遇到很多头疼的问题
  18. 六星经典CSAPP笔记(2)信息的操作和表示
  19. NAND FLAASH基础
  20. [转] R 解读逻辑回归结果:回归系数,OR

热门文章

  1. RVDS4.0上开发cortex A8 NEON程序
  2. nginx教程全集汇总(ttlsa出品)
  3. 《跟菜鸟学Cisco UC部署实战》-第 0 章 宣传-课件(一共12章,免费)
  4. codeforces VK Cup 2018 - Wild-card Round 1 (unofficial unrated mirror)
  5. java-第九章-编写程序,打印如图案,要求图案的行数由用户输入.
  6. MySQL的root默认密码修改
  7. dhcp服务配置文件/etc/dhcpd.conf详解
  8. Happy Birthday
  9. Python才排第8名!2018增速最快TOP 10编程语言盘点
  10. MySQL sql99语法—非等值连接