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运行环境是一个包含了不同的类和 ...
随机推荐
- 【转】Java类加载原理解析
原链接 1 基本信息 每个java开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载. Java的类加载机制是j ...
- C# 打开文件或打开文件夹
直接打开指定的文件 System.Diagnostics.Process.Start(v_OpenFilePath); 直接打开目录 string v_OpenFolderPath = @" ...
- HDU 1220 Cube(数学,找规律)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1220 Cube Time Limit: 2000/1000 MS (Java/Others) M ...
- Oracle数据库对象,同义词、序列、视图、索引
数据库对象简介 Oracle 数据库对象又称模式对象 数据库对象是逻辑结构的集合,最基本的数据库对象是表 其他数据库对象包括: 同义词是现有对象的一个别名. 简化SQL语句 隐藏对象的名称和所有者 提 ...
- VS2012 Getting Started with Owin and Katana
参考地址:http://www.asp.net/aspnet/overview/owin-and-katana/getting-started-with-owin-and-katana 小提示: 该示 ...
- 外部的 JavaScript
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- ATK-DataPortal 设计框架(一)
无论是简单的还是复杂的框架,总需要一个开始的原点,ATK-DataPortal中包含了所有基础类的定义. 一.业务框架基础类 1.BusinessBase:所有业务类的根类,要使用ATK库的类,必需继 ...
- Unity 游戏框架搭建 (十五) 优雅的QChain (零)
加班加了三个月终于喘了口气,博客很久没有更新了,这段期间框架加了很多Feature,大部分不太稳定,这些Feature中实现起来比较简单而且用的比较稳定的就是链式编程支持了. 什么是链式编程? 我想大 ...
- git使用过程的问题与解决办法
一.什么是Git Git是目前世界上最先进的分布式版本控制系统.工作原理 / 流程: Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote ...
- Linux/Mac scp命令笔记
scp命令用于Linux之间复制文件和目录. 参数说明: -1: 强制scp命令使用协议ssh1-2: 强制scp命令使用协议ssh2-4: 强制scp命令只使用IPv4寻址-6: 强制scp命令只使 ...