Java多线程编程总结一:多线程基本概念
Java多线程编程总结一 – 初识多线程
进程、多进程、线程、多线程的概念
进程(process):CPU的执行路径。通俗的说就是系统中正在运行的程序。比如我们打开了浏览器、QQ等等,这些程序一旦被打开运行了,就是所谓的进程。
多进程:系统中同时运行的多个程序。这个我们应该不难理解了,在打开浏览器的同时我们也可以QQ聊天、CS单机游戏等。
线程(thread):运行在进程中的运行单元。比如迅雷下载中我们的某一个下载任务就是一个线程。
多线程:同理可知,每个进程里面有多个独立的或者相互有协作关系的运行单元我们称之为多线程。
第一个多线程程序
Java中多线程的实现方式有两种:继承Thread父类、实现Runnable接口。
首先我们实现一个简单的多线程的实现,交替执行程序并输出1~20。
package MyJavaThread;
public class MyFirstThreadTest {
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
int i=1;
while (i<=20) {
System.out.println(Thread.currentThread().getName() + ": " + i++);
}
}
}).start();
int i=20;
while (i>0) {
System.out.println(Thread.currentThread().getName() + ": " + i--);
}
}
}
部分截图如下

没有真正意义上的多线程
我们知道,CPU在同一时刻只能给一个程序分配资源(单核情况下),也就是赋予一个程序运行权力,那么我们看到一次能运行好几个程序其实是CPU来回切换执行权产生的效果。因而让人们觉得是并发运行的,只是CPU切换的速度非常快罢了。
线程的状态
线程有自己的状态,我们称为生命周期:初始状态、运行状态、冻结状态和终止状态。
线程的朝阳--初始化状态
线程的初始化就是我们所说的创建了一个线程,也就是实例化了一个Thread的子类,等着被start。
线程的青春--运行状态
当我们调用了start方法的时候,此时线程就处于了运行状态。但是严谨的说,此时线程不一定就会马上运行,它处于一个临时状态,即在CPU的执行队列当中,等待CPU轮回进行执行,获取执行权。
线程的感冒--冻结状态
线程被调用了sleep方法或者调用了wait方法之后,放弃了CPU的执行权。但是冻结之后也可以再次回到运行状态,重新获取CPU的执行权。当然也可以在中断或出现异常的时候直接到死亡状态。
线程的落幕—死亡状态
如果线程出现了致命的异常或者线程的执行逻辑完毕,这就意味着线程要谢幕say byebye了。死亡后的线程不能再次回到任何一个状态。
总结
一个进程至少有一个线程在运行
Main函数本身就是一个线程,我们称之为主线程
实现多线程的方式是可以继承Thread类,也可以实现Runnable接口
没有严格意义上的并发
JVM自身有很多后台线程在运行,支撑着我们的程序
初始化状态只能到运行状态
运行状态能到冻结状态和死亡状态
冻结状态能到运行状态和死亡状态
死亡状态只能接受死亡的事实
Java多线程编程总结一:多线程基本概念的更多相关文章
- 原创】Java并发编程系列2:线程概念与基础操作
[原创]Java并发编程系列2:线程概念与基础操作 伟大的理想只有经过忘我的斗争和牺牲才能胜利实现. 本篇为[Dali王的技术博客]Java并发编程系列第二篇,讲讲有关线程的那些事儿.主要内容是如下这 ...
- Java多线程编程核心技术(三)多线程通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- day05 Java网络编程socket 与多线程
java网络编程 java.net.Socket Socket(套接字)封装了TCP协议的通讯细节,是的我们使用它可以与服务端建立网络链接,并通过 它获取两个流(一个输入一个输出),然后使用这两个流的 ...
- 【java并发编程实战】-----线程基本概念
学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...
- Java多线程编程核心技术---Lock的基本概念和使用
Lock接口: ReentrantLock的基本功能: ReentrantLock的lock和unlock方法进行加锁,解锁.可以起到和synchronized关键字一样的效果: 选择性通知!!!: ...
- 《Java多线程编程核心技术》——多线程与同步
Java多线程 线程可以理解为是在进程中独立运行的子任务. Java多线程 使用方法 Java中实现多线程主要有以下两种方法: 继承Thread,而后实例化该对象调用start()即启动了新线程; 实 ...
- JAVA并发编程学习笔记------多线程调优
1. 多线程场景下尽量使用并发容器代替同步容器 (如ConcurrentHashMap代替同步且基于散列的Map, 遍历操作为主要操作的情况下用CopyOnWriteArrayList代替同步的Lis ...
- 【Java并发编程】:多线程环境中安全使用集合API
在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对 ...
- Java并发编程(03):多线程并发访问,同步控制
本文源码:GitHub·点这里 || GitEE·点这里 一.并发问题 多线程学习的时候,要面对的第一个复杂问题就是,并发模式下变量的访问,如果不理清楚内在流程和原因,经常会出现这样一个问题:线程处理 ...
- 多线程编程-- part 3 多线程同步->synchronized关键字
多线程同时访问一个资源,可以会产生不可预料的结果,所以为这个资源加锁,访问资源的第一个线程为其加锁后,其他线程便不能在使用那个资源,直到锁被解除. 举个例子: 存款1000元,能取出800的时候我就取 ...
随机推荐
- iOS中正则表达式的基本使用方法
一.第三方框架RegexKitLite的使用 在ios项目中可以借用第三方框架RegexKitLite来简化对正则表达式的使用,使用方法如下 1.去RegexKitLite下载类库,解压出来会有一个例 ...
- 在C#中实现简单的对象池
当我们频繁创建删除大量对象的时候,对象的创建删除所造成的开销就不容小觑了.为了提高性能,我们往往需要实现一个对象池作为Cache:使用对象时,它从池中提取.用完对象时,它放回池中.从而减少创建对象的开 ...
- mysql修改表字段属性类型
例如: 修改表expert_info中的字段birth,允许其为空 >alter table expert_info change birth birth varchar(20) null; 例 ...
- [置顶]
kubernetes资源类型--持久化存储Persistent Volume和Persistent Volume Claim
概念 存储管理跟计算管理是两个不同的问题.理解每个存储系统是一件复杂的事情,特别是对于普通用户来说,有时并不需要关心各种存储实现,只希望能够安全可靠地存储数据. 为了简化对存储调度,K8S对存储的供应 ...
- DotnetBrowser高级教程-(5)使用内置的MVC UI框架-EasyMvc
如果DotnetBrowser只是实现了内置chrome浏览器和web/web socket server,似乎还不是很完美.因此,最新的DotnetBrowser已经内置对easy mvc控件的支持 ...
- 智能选择器和语义化的CSS
本文由白牙根据Heydon Pickering的<Semantic CSS With Intelligent Selectors>所译,整个译文带有我自己的理解与思想,如果译得不好或不对之 ...
- ES6中的迭代器(Iterator)和生成器(Generator)(二)
一.内建迭代器 迭代器是ES6的一个重要组成部分,在ES6中,已经默认为许多内建类型提供了内建迭代器,只有当这些内建迭代器无法实现目标时才需要自己创建.通常来说当定义自己的对象和类时才会遇到这种情况, ...
- 弄清java中的字节与字符
问题 在java中,一个字符等于多少字节? 或者更详细的问:在java中,一个英文字符等于多少字节?一个中文字符等于多少字节? 答案 Java采用unicode来表示字符,java中的一个char是2 ...
- jquery给多个span赋值
因为我想在页面载入完毕后,有几个地方显示当前时间,所以我须要给多个span赋值. span代码的写法例如以下: <span name="currentDate">< ...
- 小猪的Git使用总结
小猪的Git使用总结 文件夹 小猪的Git使用总结 安装配置与文档 下载安装 文档教程相关 概念 Git的四个组成部分 文件的几个状态 Git与SVN版本号版本号控制存储差异 每次Commit时仓库中 ...