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的时候我就取 ...
随机推荐
- JDBC_PreparedStatement 防sql注入
package songyan.jdbc.login.prepared; import java.sql.Connection; import java.sql.DriverManager; impo ...
- C语言基础之注释与常见错误
总结起来,注释有三种: 1.单行注释 1: //哈哈 单行注释 2.多行注释 1: /* 2: asdfasdfasdfasdfasdf 3: */ 其中多行注释如果这样写 1: /* 2: * 函数 ...
- Ubuntu 16.04 -- 同时配置Nginx(转发)和frp(内网映射)和HTTPS(ca加密) - 端口转发
Ubuntu16.04下: sudo apt -get nginx 用这条命令安装完nginx之后, nginx在该目录下: 然后配置nginx: 如下: 红圈圈住的地方多写几个可以做负载均衡. 端口 ...
- linux selenium运行chrome
chrome版本要和chromedriver版本匹配才能正常运行.
- HTML5游戏实战(1):50行代码实现正面跑酷游戏
前段时间看到一个"熊来了"的HTML5跑酷游戏,它是一个典型的正面2D跑酷游戏,这里借用它来介绍一下用Gamebuilder+CanTK开发正面跑酷游戏的基本方法. CanTK(C ...
- tez参数
https://tez.apache.org/releases/0.8.4/tez-api-javadocs/configs/TezConfiguration.html
- 常见的Linux系统监控命令
1.free 显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区 -b:以Byte为单位显示内存使用情况: -k:以KB为单位显示内存使用情况: -m:以MB为单位显示内存使 ...
- MySQL高可用解决方案MMM
一.MMM简介: MMM即Multi-Master Replication Manager for MySQL:mysql多主复制管理器,基于perl实现,关于mysql主主复制配置的监控.故障转移和 ...
- acd - 1403 - Graph Game(博弈 + 二分图最大匹配)
题意:N与P在玩游戏,N有 n1 个点,P有 n2 个点,N的点与P的点之间有 m 条无向边.将一个石子放在当中一点.N先移动石子.沿边移动一次,石子移动前的点及与该点相连的边被删除.接着到P移动石子 ...
- zabbix监控客户端本地网络的延时状态
配置zabbix客户端配置文件 vim /etc/zabbix/zabbix_agentd.conf 添加 Include=/etc/zabbix/zabbix_agentd.d/ 添加脚本对服务器 ...