简介

线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

通俗点说:一个程序被启动执行就是一个进程。一个进程的最小执行单元就是线程。

系统中的进程线程模型是这样的:

进程从操作系统获得基本的内存空间,所有的线程共享着进程的内存地址空间。当然,每个线程也会拥有自己私有的内存地址范围,其他线程不能访问。

实例

下面咱们通过一小段代码来感受一下什么叫做线程。

public class T01_WhatIsThread {private static class T1 extends Thread {@Overridepublic void run() {for (int i = 0; i < 10; i++) {try {TimeUnit.MICROSECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("T1");}}}public static void main(String[] args) {new T1().run();//new T1().start();for (int i = 0; i < 10; i++) {try {TimeUnit.MICROSECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("main");}}
}

正在main方法中,我实例化了T1,然后调用了T1中的实例方法run,这个是普通的方法调用,执行结果肯定大家也猜到了,会打印十次T1,然后打印十次main。现在我们运行,看一下运行的结果,果然不出所料,就是程序的顺序执行。

这和我们普通的代码执行是没有区别的,接下来我们来修改一下代码,眼睛亮的同学肯定发现了我刚刚在主方法的有个注释

new T1().start();

我们把run()所在行注释掉,把start()所在行的注释解开,这样主方法就变成了下面这样

    public static void main(String[] args) {// new T1().run();new T1().start();for (int i = 0; i < 10; i++) {try {TimeUnit.MICROSECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("main");}}

然后我们运行一下,看一下结果,

大家看到这样结果是不是有点感觉了,现在是类似于交替运行了,执行的先后顺序消失了,到这里对线程有点感觉了吗,没有的话也没关系,我们通过图例继续理解一下:

在调用run方法的时候,执行的顺序是这样的:

所以执行是应该让run方法先执行完毕,然后在回到main方法中继续执行,故结果是打印了十次T1,然后打印了十次main。

让我们使用start()方法时,执行的顺序是这样的:

当我们使用线程启动run中的方法后,他的级别是个main方法一样高的,故而打印结果是交替的结果,这是由于他们在这段时间时间都发生了,而不是等前一个事件结束才执行。

【并发编程】对线程的初步认识相关推荐

  1. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

  2. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

    文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...

  3. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自 Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mul ...

  4. (转)Java并发编程:线程池的使用

    背景:线程池在面试时候经常遇到,反复出现的问题就是理解不深入,不能做到游刃有余.所以这篇博客是要深入总结线程池的使用. ThreadPoolExecutor的继承关系 线程池的原理 1.线程池状态(4 ...

  5. 并发编程-13线程安全策略之两种类型的同步容器

    文章目录 脑图 概述 同步容器 集合接口下的同步容器实现类 Vector (线程安全性比ArrayList好一些,但并非绝对线程安全) 同步容器 线程不安全的场景 其他注意事项 Hashtable C ...

  6. 并发编程-12线程安全策略之常见的线程不安全类

    文章目录 脑图 概述 字符串拼接子之StringBuilder.StringBuffer StringBuilder (线程不安全) StringBuffer (线程安全) 小结 时间相关的类 Sim ...

  7. 并发编程-11线程安全策略之线程封闭

    文章目录 脑图 概述 线程封闭的三种方式 示例 堆栈封闭 ThreadLocal Step1. ThreadLocal操作类 Step2. 自定义过滤器 Step3. 注册拦截器,配置拦截规则 Ste ...

  8. 并发编程-06线程安全性之可见性 (synchronized + volatile)

    文章目录 线程安全性文章索引 脑图 可见性定义 导致不可见的原因 可见性 -synchronized (既保证原子性又保证可见性) 可见性 - volatile(但不保证操作的原子性) volatil ...

  9. 并发编程-05线程安全性之原子性【锁之synchronized】

    文章目录 线程安全性文章索引 脑图 概述 原子性synchronized 修饰的4种对象 修饰代码块 作用范围及作用对象 Demo 多线程下 同一对象的调用 多线程下不同对象的调用 修饰方法 作用范围 ...

  10. 并发编程-04线程安全性之原子性Atomic包的4种类型详解

    文章目录 线程安全性文章索引 脑图 概述 原子更新基本类型 Demo AtomicBoolean 场景举例 原子更新数组 Demo 原子更新引用类型 Demo 原子更新字段类型 使用注意事项: Dem ...

最新文章

  1. Go to sleep
  2. ASP.Net生成静态HTML页!
  3. 第九十六期:JavaScript 中的 4 个相等比较算法的介绍
  4. web.py开发web 第一章 Hello World
  5. 网络-console
  6. python爬人人贷代码视频_利用python爬取人人贷网的数据
  7. 2.5维数字地图制作
  8. FPS游戏(UE4,U3D引擎)方框绘制,骨骼透视,BT功能的原理 和反外挂策略
  9. BCM业务连续性管理
  10. 常见的几种IDEA使用技巧
  11. 微信支付宝付款码规则
  12. Matplotlib之条形图绘制
  13. kubelet nodelost
  14. 几何分布的期望公式的推导
  15. VS2017 创建安装项目模板
  16. 方法简单手把手教你,空闲时间在家剪辑视频,一天收入300多
  17. Acoustics | 声音时间检测:日常声音理解
  18. 应用宝使用绑定iOS下载
  19. 与哈尔滨工业大学两位信安专业同学的通信(2005年)
  20. 人才推荐系统数据库设计

热门文章

  1. python3 遍历列表list 四种方法
  2. linux objdump 反汇编命令
  3. linux 内核 数据结构 file_operations、file、inode
  4. editplus配置 linux shell 语法高亮 自动补全
  5. /bin,/sbin,/usr/sbin,/usr/bin 目录区别
  6. linux 源码安装 yum rpm区别
  7. _declspec(naked) 使用(裸函数)
  8. 深入理解 C 指针阅读笔记 -- 第一章
  9. 编程之美2.2 不要被阶乘吓倒
  10. c++find函数_Excel中八大经典函数组合,帮你整理齐了