Java并发(多线程)
一、多线程的基本概念
1.什么是进程、多进程有什么作用?
大家都使用计算机,当我们打开某一个软件的时候,其实就是启动了一个进程,可以打开任务管理器看看,我们打开的每一个软件,都是一个进程,在同一个操作系统中,可以同时启动多个进程。
单进程计算机只能在一个时间内做一件事情。在我们打开办公软件的的时候,也可以同时听歌,为什么呢?不是只能做一件事情吗,这是因为操作系统将cpu的时间片分配给了每一个进程,让我们感觉是并行处理的。
多进程不是为了提高执行速度,是为了提高CPU使用率,具体只是可以去学习操作系统进行了解
进程与进程之间是独立的
2.什么是线程,多线程有什么作用?
线程是进程中的一个执行场景,他们是共享数据的(堆内存和方法区内存、栈内存是独立的),一个线程一个栈
与进程相比,线程更轻量级,创建、撤销一个线程比启动新进行的开销要小得多
3.java程序的运行原理
java命令会启动Java虚拟机,启动JVM,等于启动了一个应用程序,表示启动了一个进程,该进程会自动自动一个“主线程”,然后主线程去调用某个类的main方法,所以main方法运行在主线程中,在此之前所有的程序都是单线程的。
二、线程的创建和启动
1、继承Thread类
public class Test{
public static void main(String[] args) {
Person person = new Person();
person.start(); //start不是马上执行,而是使线程进入就绪,真正执行是由JAVA的线程调度机制来完成
for(int i=0; i<10; i++){
System.out.println("main ->" + i);
}
}
}
class Person extends Thread{
public void run(){
for(int i=0; i<30; i++){
System.out.println("run ->" +i);
}
}
}
2、实现Runnable接口(推荐)
public class Test{
public static void main(String[] args) {
Person person = new Person();
Thread t = new Thread(person);
t.start();
for(int i=0; i<10; i++){
System.out.println("main ->" + i);
}
}
}
class Person implements Runnable{
public void run(){
for(int i=0; i<30; i++){
System.out.println("run ->" +i);
}
}
}
由于Runnable是一个函数式接口,可以用lamda表达式建立一个实例:
Runnable r = () ->{...};
三、线程的生命周期

这是网上找的图
初始状态:新创建一个线程对象
可运行状态:也就是就绪状态,调用start()方法后,该线程有权利获取cpu时间片
运行状态:获取到cpu时间片后开始运行,如果这次没有运行完,下一次接着运行,不是从头开始
阻塞状态:因为某种原因放弃了cpu的使用权,暂时停止运行,直到线程调度器重新激活它
死亡状态:线程执行完了或因异常退出了run方法
方法比较:
- Thread.sleep(long millis),一定是当前线程调用此方法,当前线程进入TIME_WAITING状态,但不释放对象锁,millis后线程自动苏醒进入就绪状态。作用:给其它线程执行机会的最佳方式。
- Thread.yield(),一定是当前线程调用此方法,当前线程放弃获取的cpu时间片,由运行状态变会就绪状态,让OS再次选择线程。作用:让相同优先级的线程轮流执行,但并不保证一定会轮流执行。实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。Thread.yield()不会导致阻塞。
- t.join()/t.join(long millis),当前线程里调用其它线程t的join方法,当前线程进入TIME_WAITING/TIME_WAITING状态,当前线程不释放已经持有的对象锁。线程t执行完毕或者millis时间到,当前线程进入就绪状态。
- obj.wait(),当前线程调用对象的wait()方法,当前线程释放对象锁,进入等待队列。依靠notify()/notifyAll()唤醒或者wait(long timeout)timeout时间到自动唤醒。
- obj.notify()唤醒在此对象监视器上等待的单个线程,选择是任意性的。notifyAll()唤醒在此对象监视器上等待的所有线程。
为什么弃用stop和suspend方法?
stop方法天生就不安全,当线程被终止,立即释放对象锁,这会导致对象处于不一致的状态。例如:在转账的时候,钱已转出,对方还没到账,对象锁已经被破坏;当线程要终止另一个线程的时候,无法知道什么时候调用stop方法是安全的,什么时候导致对象被破坏
在看suspend,和stop不同,suspend不会破坏对象,但是如果用suspend挂起一个持有一个锁的线程,该锁在恢复之前是不可用的,如果要调用suspend方法的线程试图获得同一个锁,那么程序死锁;被挂起的线程等着被恢复,而将其挂起的线程等待获得锁
补一张图(牛客上看见的):

Java并发(多线程)的更多相关文章
- java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)
Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...
- java 并发多线程 锁的分类概念介绍 多线程下篇(二)
接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...
- java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)
目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...
- Java并发多线程 - 并发工具类JUC
安全共享对象策略 1.线程限制 : 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 2.共享只读 : 一个共享只读的对象,在没有额外同步的情况下,可以被多个线程并发访问, 但是任何线程都 ...
- Java并发/多线程系列——初识篇
回到过去,电脑有一个CPU,一次只能执行一个程序.后来多任务处理意味着计算机可以同时执行多个程序(AKA任务或进程).这不是真的"同时".单个CPU在程序之间共享.操作系统将在运行 ...
- day 04 Java并发多线程
http://www.cnblogs.com/hellocsl/p/3969768.html?utm_source=tuicool&utm_medium=referralPS:而JVM 每遇到 ...
- Java并发(一)Java并发/多线程教程
在过去一台电脑只有单个CPU,并且在同一时间只能执行单个程序.后来出现的"多任务"意味着电脑在可以同时执行多个程序(AKA任务或者进程).虽然那并不是真正意义上的"同时& ...
- Java并发多线程面试题 Top 50
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...
- Java并发-多线程面试(全面)
1. 什么是线程?2. 什么是线程安全和线程不安全?3. 什么是自旋锁?4. 什么是Java内存模型?5. 什么是CAS?6. 什么是乐观锁和悲观锁?7. 什么是AQS?8. 什么是原子操作?在Jav ...
- java并发多线程(摘自网络)
1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和 ...
随机推荐
- 4519: [Cqoi2016]不同的最小割
4519: [Cqoi2016]不同的最小割 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 489 Solved: 301 [Submit][Stat ...
- spring boot Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @Context ...
- mybatis学习记录四——输入、输出映射
6 输入映射 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型. 6.1.1 需求 完成用户信息的综合查询,需要传入查询条件很 ...
- readonly disabled
$("#cpeIdInput").attr('disabled',false); //禁用之后数据提交不到后台(IE),解决方法在点击按钮时禁用,想办法在提交之前(beforeS ...
- 数据库——MySQL——存储引擎
现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等.数据库中的表也应该有不同的类型,表的类型不同,会对 ...
- mac启动springboot失败,8080端口被占用,mac命令行关闭端口
如下图,idea启动springboot失败,8080端口被占用 Error starting ApplicationContext. To display the conditions report ...
- Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616779 本文出自方志朋的博客 简介 采用openresty 开发出的api网关有很多 ...
- redis sentinel搭建以及在jedis中使用
一.redis主从搭建 1.搭建redis master 1>redis安装 mkdir -p /usr/local/webserver/redis //安装目录 cd /usr/local/w ...
- [vue warn]:typeError:_this.getMounted.forEach is not a function
问题:报错 解决:forEach前面给数组,自己放的是Json,所以报错
- 20181009noip HZ EZ 两校联考trade(优先队列,贪心)
题面戳这里 思路: 裸的,贪心... 考场上写了一个数据分治(70ptsDP,30pts线段树优化贪心,GG了后30分) 这道题其实很简单的 我们看图: 我们在A时刻买一个东西,在B时刻卖出去,我们可 ...