一、进程与线程的概念

进程和线程都是一个CPU工作时间段的描述,只是关注点不同。

进程(Process):

资源(CPU,内存等,文件,网络等)分配的基本单位。系统中有很多进程,它们都会使用内存。为了确保内存不被其他进程使用,每个进程所能访问的内存都是分配好的,不能互相干扰。

线程(Thread):

CPU 运行调度的基本单位。利用 CPU 去运行代码,线程必须被包含在进程中,一个进程可以有多个线程(至少有一个),这些线程有自己的资源(栈,寄存器等),其它线程可以读写这些栈内存。

线程也有自己的局部存储(TLS)和当前指令指针(PC,标明下一指令执行点)。

总结:

进程像一个容器,里面有很多线程和资源,进程分配这些资源让线程去执行。线程之间通信很容易,进程之间通信(IPC)需要借助其他介质,如消息队列,管道等。同一进程内的线程间切换比进程间的切换要快。

线程是一种轻量级的进程,是由进程派生出来的子任务,它是程序执行的一个路径。每个线程都有自己的局部变量表、程序计数器(指向真正执行的指令指针)以及各自的生命周期。

https://docs.oracle.com/javase/tutorial/essential/concurrency/procthread.html

二、并行与并发

Parallel(Parallelism)并行:计算机能同时执行两个或多个任务

Concurrent(Concurrency)并发:计算机能执行两个或多个任务,但不是同时,而是在任务间快速切换执行

并发的重点在于有处理多个任务的能力,不一定要同时。而并行的重点在于就是有同时处理多个任务的能力。

https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

三、创建线程

在 JAVA 中创建线程只有一种方式,那就是构造 Thread 类。

而实现线程的执行单元则有两种方式,第一种是重写 Thread 类的 run 方法;第二种是实现 Runnable 接口的 run 方法,并且将 Runnable 实例用作构造 Thread 的参数。

当启动了一个 JVM 时,从操作系统开始就会创建一个新的 JVM 进程,之后 JVM 进程中将会派生或者创建很多线程。

https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

new Thread(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}.start(); new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}).start();

四、Thread 的 start() 与 run()

明确 “线程的执行单元” 与 “线程” 是两个不同的概念。在 JAVA 中通过 Thread 类重写的 run() 方法是线程的执行单元,而通过调用 start() 方法才是真正启动了一个线程。

// start方法,核心部分是 start0() 这个 JNI 本地方法,开启了新的线程
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {}
}
}
private native void start0(); // run 方法,直接在当前线程执行,没有创建线程
@Override
public void run() {
if (target != null) {
target.run();
}
}

https://mp.weixin.qq.com/s/MKhjg6JvOn4LM0j4rjj5cA

https://hit-alibaba.github.io/interview/basic/arch/Concurrency.html

Java-Thread 线程的更多相关文章

  1. Java Thread线程控制

    一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...

  2. 学习接水系统(java+thread线程)

    (一)项目框架分析 对于学生并发接水项目,根据面向对象的思想,需要创建两个对象,即学生和水龙头. 接下来主要讲解不排队接水和排队接水两张情况. 项目的目录文件如下: (二)不排队接水 假设有四个学生小 ...

  3. Java Thread(线程)案例详解sleep和wait的区别

    上次对Java Thread有了总体的概述与总结,当然大多都是理论上的,这次我将详解Thread中两个常用且容易疑惑的方法.并通过实例代码进行解疑... F区别 sleep()方法 sleep()使当 ...

  4. JAVA Thread线程异常监控

    一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 publ ...

  5. java thread 线程锁同步,锁,通信

    12.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步 Case:银行取钱问题,有以下步骤: A.用户输入账户.密码,系统判断是否登录成功 B.用户输入取款金额 ...

  6. java thread 线程40个问题汇总

    http://www.codeceo.com/article/40-java-thread-problems.html 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了, ...

  7. communication between threads 线程间通信 Programming Concurrent Activities 程序设计中的并发活动 Ada task 任务 Java thread 线程

    Computer Science An Overview _J. Glenn Brookshear _11th Edition activation 激活 parallel processing 并行 ...

  8. java: Thread 和 runnable线程类

    java: Thread 和 runnable线程类 Java有2种实现线程的方法:Thread类,Runnable接口.(其实Thread本身就是Runnable的子类) Thread类,默认有ru ...

  9. java 创建线程的三种方法Callable,Runnable,Thread比较及用法

    转自:http://www.chinaitlab.com/Java/line/942440.html 编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互.一般有三种方法,Thread, ...

  10. Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别

    一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...

随机推荐

  1. LintCode 6---合并排序数组 II

    import java.util.Arrays; public class Lint6 { /* * 合并两个排序的整数数组A和B变成一个新的数组.新数组也要有序. */ public static ...

  2. 【lucene】一个简单的招聘网站的建立

    1.建立索引库: 核心代码如下 package com.tabchanj.job.index; import java.util.ArrayList; import java.util.HashMap ...

  3. CentOS查看Java进程并部署jar包

    查看Java进程获取pid号:ps -ef|grep java|grep -v grep 部署Javajar包并指定输出日志文件(null不输出):nohup java -jar xx.jar > ...

  4. java的移位和异或运算

    Java移位运算种类 基础:我们知道在Java中int类型占32位,可以表示一个正数,也可以表示一个负数.正数换算成二进制后的最高位为0,负数的二进制最高为为1 例子: -5换算成二进制后为:1111 ...

  5. nginx redirect ignore port 两层nginx跳转忽略了端口

    问题: 两层nginx做代理,第一层:nginx:将9087->代理到80端口,第二层:将80端口->流量打到我们的代码上,结果在代码中拿到的链接不带9087端口,则代码中发生跳转的时候, ...

  6. Zookeeper启动失败,报错 can not open chanel to 2

    zookeeper 3.4.8 安装在 7 台不同的虚拟机上,配置文件如下: tickTime= initLimit= syncLimit= dataDir=/var/zookeeper client ...

  7. LVM使用手册简化命令

    创建 hot_add    --查看新增的lun pvcreate /dev/sdb   --创建物理卷 pvcreate /dev/sdc   --创建物理卷 pvcreate /dev/sdd   ...

  8. QT 给工程添加图片

    先打开如图的打开方式 然后我们看到以下的画面,选择下面的 然后我们选择如下:,这里我们要注意我们的图片资源有一定要和QRC资源在同一个文件夹中 之后我们通过在stylesheet里面设置来使用我们添加 ...

  9. SQL SERVER 2012安装配置说明(多图详解)

    1. 优先安装软件 1. net framework3.5. 2. 在安装SQL SERVER 2012前需要3.5的支持.在WIN 2012系统可以在系统管理的添加角色和功能中安装,如下将[.NET ...

  10. 什么是Redis缓存穿透、缓存雪崩和缓存击穿

    https://baijiahao.baidu.com/s?id=1619572269435584821&wfr=spider&for=pc 缓存穿透 缓存穿透,是指查询一个数据库一定 ...