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的时候我就取 ...
随机推荐
- IOS8设备连接XCODE6真机调试报错"Could not inspect the application package"
每次真机调试都要运行2次才行,解决办法:把product name改成英文就行了.
- 遍历Map的四种方式
方法一 在for-each循环中使用entries来遍历 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. 注意:for-each循环在java 5中被引入所以该方法只能应用于 ...
- 一个小时内学习SQLite数据库
一个小时内学习SQLite数据库 2012-05-11 10:24 红薯 OSCHINA 字号:T | T SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. ...
- 单核时代,PHP之类多线程或者多进程的,是怎么处理并发的?是排队吗?
答案是:的确就是排队.但是并不是一定要处理完请求1才能去处理请求2:实际上请求的处理过程中,有很多的时间是耗在IO等其他地方,这时可以切换去处理其他请求,把等待的时间可以充分利用起来,达到更高的吞 ...
- appium python学习记录
这是网上找到的测试用例 from appium import webdriver desired_caps = {} desired_caps['platformName'] = 'Android' ...
- python git log
# -*- coding: utf-8 -*- # created by vince67 Feb.2014 # nuovince@gmail.com import re import os imp ...
- Linux查看目录大小
du -ah --max-depth=1 a表示显示目录下所有的文件和文件夹(不含子目录) h表示以人类能看懂的方式 max-depth表示目录的深度
- 让Mac支持lrzsz
http://blog.csdn.net/citywolf4/article/details/49071679 https://github.com/mmastrac/iterm2-zmodem
- Solidworks草图或者特征无法删除怎么办
单击重新建模之后即可删除.
- linux ln 命令使用参数详解(ln -s 软链接)(转)
这是linux中一个非常重要命令,请大家一定要熟悉.它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件. 当 我们需要在不同的 ...