Java—进程与线程
- 进程与线程
进程是程序(任务)的执行过程,具有动态性;持有资源(共享内存、共享文件)和线程,是资源和线程的载体。
线程是系统中最小的执行单元,同一进程中有多个线程,线程共享进程的资源。
线程的交互,交互的方式包括互斥与同步。
- 线程的常用方法
java对线程的支持主要体现在类Thread和接口Runnable,它们都继承java.lang包,有一个共同的方法run()

- 线程停止错误的方法:stop()、interrupt()
- 线程停止的正确方法
public class ArmyRunnable implements Runnable {
//volatile保证了线程可以正确读取其他线程写入的值
volatile boolean keepRunning = true;
@Override
public void run() {
while(keepRunning) {
//发动五连击
for (int i = 0; i < 5 ; i++) {
System.out.println(Thread.currentThread().getName() + "进攻对方[" + i + "]");
}
//暂停
Thread.yield();
}
System.out.println(Thread.currentThread().getName() + "结束了战斗");
}
}
- 争用条件
当多个线程同时共享访问同一数据(内存区域)时,每个线程都尝试操作该数据,从而导致数据被破坏(corrupted),这种现象称为争用条件。
- 线程的交互:互斥与同步
互斥:在同一时间,只能有一条线程去对我们的关键数据或临界区进行操作。
互斥的实现:sysnchronized(intrinsic lock),sysnchronized相当于给代码加上一把锁,使其他线程不能进入这个关键区域访问我们的关键资源。
同步:是线程之间的一种通信机制, 由于一条线程的某些条件不具备,使得其他线程处于某种等待的状态,之后由于条件具备了,一条线程会用某种方式唤醒其他的线程。
同步的实现:wait()/notify()/notifyAll()--Object对象的成员方法
wait set 是线程的休息室
public void transfer(int from, int to, double amount) {
//通过synchronized 关键字来实现互斥,synchronized既可以出现在方法之上,也能以块的形式出现在方法体之中
//通过对lockObj加锁实现互斥
//加锁操作是有开销的,多次加锁操作会降低系统的性能
synchronized (lockObj) {//while循环,保证条件不满足时任务都会被条件阻挡,而不是继续竞争CPU资源
while (energyBoxes[from] < amount) {
try {
//条件不满足,将当前线程放入锁对象(lockObj)上的wait set
//wait set 是线程的休息室
lockObj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName());
energyBoxes[from] -= amount;
System.out.printf("从%d转移%10.2f单位能量到%d", from, amount, to);
energyBoxes[to] += amount;
System.out.printf("能量总和:%10.2f%n",getTotalEnergies());
//唤醒所有在lockObj对象上等待的线程
lockObj.notifyAll();
}
}
- Runnable方式和Thread方式创建线程的区别

- Runnable方式可以避免Thread方式由于Java单继承特性带来的缺陷
- Runnable的代码可以被多个线程(Thread实例)共享,适合于多个线程处理同一资源的情况
- 线程的生命周期

- 就绪:创建了线程对象后,调用了线程的start()方法(此时线程只是进入了线程队列,等待获取CPU服务,具备了运行的条件,但并不一定已经开始运行了)。
- 运行:处于就绪状态的线程,一旦获取了CPU资源,便进入到运行状态,开始执行run()方法里面的逻辑。
- 终止:线程的run()方法执行完毕,或者线程调用了stop()方法(这种方法已经out),线程便进入终止状态。
- 阻塞:一个正在执行的线程在某些情况下,由于某种原因而暂时让出了CPU资源,暂停了自己的执行,便进入了阻塞状态,如调用了sleep()方法
- 用户线程和守护线程
- 用户线程:运行在前台,执行具体的任务,如程序的主线程、连接网络的子线程
- 守护线程:运行在后台,为其他前台线程服务,一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作。
- 守护线程的应用:数据库连接池中的监测线程、JVM虚拟机启动后的监测线程。最常见的守护线程是垃圾回收线程
- 设置守护线程:通过调用Thread类的setDaemon(true)方法来设置当前的线程为守护线程。注意:setDaemon(true)必须在start()方法之前调用,否则会抛出异常;在守护线程中产生的新线程也是守护线程;不是所有的任务都可以分配给守护线程来执行,比如读写操作或者计算逻辑。
- 扩展
Java Memory Mode
Locks & Condition
线程安全性: 原子性与可见性 ...
多线程编程常用的交互模型
Java5中并发编程工具
- 参考书
core java
Java concurrency in practice
Java—进程与线程的更多相关文章
- Java进程和线程关系及区别
1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基 ...
- Java 进程和线程
进程和线程 在并发编程中,有两个基本的执行单元:进程和线程.在Java编程语言中,通常并发编程主要与线程有关.但是进程也很重要. 计算机系统通常具有许多活动的进程和线程.即使在只有一个执行核心,因此在 ...
- Java进程与线程的区别
每个进程都独享一块内存空间,一个应用程序可以同时启动多个进程.比如浏览器,打开一个浏览器就相当于启动了一个进程. 线程指进程中的一个执行流程,一个进程可以包含多个线程. 每个进程都需要操作系统为其分配 ...
- [Java]进程与线程的区别(转)
线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; (2)资源拥有: ...
- java - 进程和线程的区别及联系
1. 进程 (1)进程主要有两个特征: a. 进程是一个实体,占有一定的地址空间.每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region).数据区域(data region) ...
- java进程和线程的区别
什么是进程,什么是线程系统要做一件事,运行一个任务,所有运行的任务通常就是一个程序:每个运行中的程序就是一个进程,这一点在任务管理器上面可以形象的看到.当一个程序运行时,内部可能会包含多个顺序执行流, ...
- 面试4——java进程和线程相关知识
1.线程和进程的概念.并行和并发的概念
- Java进程和线程
进程是资源分配和任务调度的基本单位, 进程就是包含上下文切换的程序执行时间总和=CPU加载上下文环境+CPU执行+CPU保存上下文环境,可以理解为时间片段: 进程的颗粒度太大了,将进程分块,按照a,c ...
- 巧用Grafana和Arthas自动抓取K8S中异常Java进程的线程堆栈
前言 近期发现业务高峰期时刻会出现CPU繁忙导致的timeout异常,通过监控来看是因为Node上面的一些Pod突发抢占了大量CPU导致的. 问: 没有限制CPU吗?是不是限制的CPU使用值就可以解决 ...
随机推荐
- opencv_python使用cv2.imread()读取中文路径报错问题(转)
原地址:https://blog.csdn.net/liuqinshouss/article/details/78696032 1 说明 本篇中使用的opencv版本为3.3,python使用的版本为 ...
- Js写九宫格抽奖
国庆出去转了一圈,回来及时把以前写的一些有用的在这儿记录一下 --------------------------------------------我是分割线-------------------- ...
- 卸载Windows,安装纯Linux
操作步骤 下载安装一键GHOST优盘版 参考帮助文档,安装U盘启动 重启电脑,F12进入模式选择界面,选择USB device 选择DOS 工具 进入Disk Genius 删除掉除主分区(0)外的其 ...
- zookeeper 选举机制 和 eruake
zookeeper简介: 在分布式环境中,多个服务之间协调一致.有提供分布式锁.服务配置.实现分布式领域CAP(consistency一致性,Availiablity高可用,patition tolr ...
- LeetCode 100.相同的树(C++)
给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1 ...
- 理解session和cookie
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态.它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的.例如,使用 Cookie ...
- spring线程池ThreadPoolTaskExecutor与阻塞队列BlockingQueue
一: ThreadPoolTaskExecutor是一个spring的线程池技术,查看代码可以看到这样一个字段: private ThreadPoolExecutor threadPoolExecut ...
- Nginx几个简单命令
• 启动nginx服务 sudo brew services start nginx 利用http://localhost:8080进行访问, 如果出现如下界面,说明启动成功. • 查看nginx版本 ...
- step5: 编写spider爬取
改写parse函数 实现功能: 1.获取文章列表页中的文章url并交给scrapy下载后,交给解析函数进行具体字段的解析2.获取下一页的url并交给scrapy进行下载,下载完成后交给parse 提取 ...
- [转]glyphicons-halflings-regular字体 图标
本文转自:http://www.ijquery.cn/?p=377 一.介绍 采用这种字体,我们可以避免网站制作中采用好多图片,一方面解决了浏览器的兼容性问题.另一方面,这些字体都是矢量字体,我们只要 ...