多线程简单总结

  • 1. 相关概念
    • 1.1 线程与进程
      • 进程
      • 线程
    • 1.2 线程调度
      • 分时调度
      • 抢占式调度
    • 1.3 同步与异步
      • 同步
      • 异步
    • 1.4 并发与并行
      • 并发
      • 并行
  • 2. 创建线程
    • 2.1 继承Thread类
    • 2.2 实现Runnable接口
    • 2.3 Callable和FutureTask
    • 2.4 几种线程创建方法比较
  • 3. Thread类
    • 3.1 常用构造方式
    • 3.2 常用方法
  • 4. 待总结

Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。

这里定义和线程相关的另一个术语 - 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。

多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。

1. 相关概念

1.1 线程与进程

进程

是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间

线程

是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行。一个进程最少有一个线程。线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程。

1.2 线程调度

分时调度

所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。

抢占式调度

优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性), Java使用的为抢占式调度。
CPU使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核新而言,某个时刻, 只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是在同一时刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。

1.3 同步与异步

同步

排队执行 , 效率低但是安全。

异步

同时执行 , 效率高但是数据不安全。

1.4 并发与并行

并发

指两个或多个事件在同一个时间段内发生。

并行

指两个或多个事件在同一时刻发生(同时发生)。

2. 创建线程

2.1 继承Thread类

package com.java.thread.demo01;public class MyThread extends Thread {/*** run方法就是线程要执行的任务方法*/@Overridepublic void run() {//这里的代码就是一条新的执行路径//这个执行路径的触发方式,不是调用run方法,而是通过Thread对象的start方法来启动任务for (int i = 0; i < 10; i++) {System.out.println("人生代代无穷已" + i);}}
}
package com.java.thread.demo01;public class Demo01Thread {public static void main(String[] args) {//ThreadMyThread thread = new MyThread();thread.start();for (int i = 0; i < 10; i++) {System.out.println("江月年年望相似" + i);}}
}

运行结果如下,每次运行结果可能不同:

2.2 实现Runnable接口

package com.java.thread.demo01;public class MyRunnable implements Runnable {@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println("人生代代无穷已" + i);}}
}
package com.java.thread.demo01;public class Demo02Runnable {public static void main(String[] args) {//实现Runnable//1. 创建一个任务对象MyRunnable r = new MyRunnable();//2. 创建一个线程并为其分配一个任务Thread t = new Thread(r);//3. 执行线程t.start();for (int i = 0; i < 5; i++) {System.out.println("江月年年望相似" + i);}}
}

运行结果如下,每次运行结果可能不同:

2.3 Callable和FutureTask

如果一个线程需要有返回值时,可以采用实现Callable接口来实现多线程

package com.java.thread.demo01;import java.util.concurrent.Callable;class MyCallable<String> implements Callable<String> {private String title;MyCallable(String title) {this.title = title;}@Overridepublic String call() throws Exception {//从1-3报数for (int i = 0; i < 3; i++) {System.out.println(title + "报数:" + (i + 1));}return (String) (title + "执行结束");}
}
package com.java.thread.demo01;import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class Demo03Callable {public static void main(String[] args) throws ExecutionException, InterruptedException {MyCallable callable1 = new MyCallable("线程1");MyCallable callable2 = new MyCallable("线程2");MyCallable callable3 = new MyCallable("线程3");FutureTask<String> task1 = new FutureTask<>(callable1);FutureTask<String> task2 = new FutureTask<>(callable2);FutureTask<String> task3 = new FutureTask<>(callable3);new Thread(task1).start();new Thread(task2).start();new Thread(task3).start();System.out.println(task1.get());System.out.println(task2.get());System.out.println(task3.get());}
}

运行结果如下,每次运行结果可能不同:

2.4 几种线程创建方法比较

  • 实现Runnable 与 继承Thread相比,有如下优势:
  1. 通过创建任务,然后给线程分配的方式来实现的多线程,更适合多个线程同时执行相同任务的情况

  2. 可以避免单继承带来的局限性

  3. 任务与线程本身是分离的,提高了程序的健壮性

  4. 后续学习的线程池技术,接受Runnable类型的任务,不接受Thread类型的任务

  • Runnable 与 Callable的相同点
  1. 都是接口

  2. 都可以编写多线程程序

  3. 都采用Thread.start()启动线程

  • Runnable 与 Callable的不同点
  1. Runnable没有返回值;Callable可以返回执行结果

  2. Callable接口的call()允许抛出异常;Runnable的run()不能抛出

  • Callable获取返回值
    Callalble接口支持返回执行结果,需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执
    行,如果不调用不会阻塞。

3. Thread类

3.1 常用构造方式

Constructor Description
Thread() Allocates a new Thread object.
Thread(Runnable target) Allocates a new Thread object.
Thread(Runnable target, String name) Allocates a new Thread object.
Thread(String name) Allocates a new Thread object.

3.2 常用方法

Modifier and Type Method Description
static Thread currentThread() Returns a reference to the currently executing thread object.
long getId() Returns the identifier of this Thread.
String getName() Returns this thread’s name.
int getPriority() Returns this thread’s priority.
void setDaemon(boolean on) Marks this thread as either a daemon thread or a user thread.
void setPriority(int newPriority) Changes the priority of this thread.
static void sleep(long millis) Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.
static void sleep(long millis, int nanos) Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds plus the specified number of nanoseconds, subject to the precision and accuracy of system timers and schedulers.
void start() Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.

4. 待总结

线程安全问题与锁

死锁

多线程通信问题

线程的六种状态

线程池

Java学习笔记2 多线程简单总结相关推荐

  1. Java学习笔记5-1——多线程

    目录 前言 核心概念 线程创建 继承Thread类 实现Runnable接口 上述两个方法小结 实现Callable接口 并发问题简介 静态代理模式 线程状态 线程停止(stop) 线程休眠(slee ...

  2. JAVA学习笔记--4.多线程编程 part1.背景知识和内存模型

    2019独角兽企业重金招聘Python工程师标准>>> 背景知识 CPU Cache 如上简易图所示,在当前主流的CPU中,每个CPU有多个核组成的.每个核拥有自己的寄存器,L1,L ...

  3. 【Java学习笔记】——多线程

    [笔记]跟着狂神学Java-多线程篇 线程/进程 我的理解:电脑上执行的一个游戏窗口是一个进程,每个模式或者按钮是一个线程 继承Thread类 一个类继承了Thread类之后,可以重写Thread类中 ...

  4. JAVA学习笔记--4.多线程编程 part5.这些年的那些坑

    2019独角兽企业重金招聘Python工程师标准>>> 基本要求 没指定线程name. 没有限定线程个数. Thread#stop等被废弃的方法不安全,详见TODO. 注意锁作用的对 ...

  5. java学习笔记(九)----多线程

    class ThreadDemo1 { public static void main(String[] args)   { new TestThread().start(); //用start()默 ...

  6. Java学习笔记5-2——多线程

    目录 线程同步 三大不安全案例 一.不安全的买票过程 二.不安全的取钱过程 三.线程不安全的集合 synchronized 解决三大不安全案例 一.解决不安全的买票过程 二.解决不安全的取钱过程 三. ...

  7. Java学习笔记(八):简单的窗体实现KNN手写体识别(借鉴)

    一.KNN手写识别原理 在下图中,要判断绿色圆归属为哪个类(红三角形还是蓝四边形) 如果K=3,因为红三角形占比例为2/3,所以绿色圆归属为红色三角形: 如果K=5,因为蓝四边形比例为3/5,所以绿色 ...

  8. JAVA学习笔记_Junit测试简单使用_assertEquals

    一开始,是通过输出结果判断输出结果是否正确来判断,console虽然输出是true,false 和预期的是一样,但是junit显示都是成功的,并没有出现报错,达不到使用junit测试的效果. juni ...

  9. JAVA学习笔记_Junit测试简单使用_断言assertEquals

    一开始,是通过输出结果判断输出结果是否正确来判断,console虽然输出是true,false 和预期的是一样,但是junit显示都是成功的,并没有出现报错,达不到使用junit测试的效果. juni ...

最新文章

  1. jmeter中没有sampler_JMeter 接口自动化测试篇 29
  2. goldengate版本升级( from v10.4 to v11.1.1.1.0.29)
  3. java拉丁正方形_LeetCode JAVA解题---824. 山羊拉丁文
  4. 多个java文件编译并打成jar包经典方法
  5. bottleneck resnet网络_深度学习|图像分类:ResNet(二)
  6. 01 hadoop介绍、架构原理
  7. OpenCV入门教程,超详细OpenCV入门教程!10小时让你轻松掌握opencv的使用
  8. traceroute/tracert原理
  9. Mac 下安装pip,卸载pip方法
  10. 使用EXCEL进行数据分组分析法
  11. Windows系统封装(二)导入封装工具安装软件,安装系统。
  12. Pollard’s rho 算法解大数质因子问题
  13. 达人评测 r7 7840HS和i5 1340p选哪个 锐龙r77840HS和酷睿i51340p对比
  14. 打猎游戏——HTML版(JavaScript的应用)
  15. flink Table Api 理论篇
  16. 如何搬运短视频,从快手搬运视频图文教程攻略
  17. 基于空间域的信息隐藏关键技术研究
  18. [开源工具]小鸟云虚拟主机+wordpress搭建个人博客(不喜勿喷)
  19. 摄影技巧分享之:如何拍好全家福
  20. 基于 Python 的音乐流派分类

热门文章

  1. 利用6N137光耦实现磁栅尺24伏差分信号转5伏单端信号
  2. Part-Guided Attention Learning for Vehicle Instance Retrieval
  3. 【转载】云计算、大数据和人工智能
  4. C#调用存储过程的类
  5. 微信视频界面提示“无法获取摄像头数据,请再次尝试”
  6. 计算机控制课件--第3版,计算机控制系统第3章ppt课件.ppt
  7. 甘肃中医药大学本科毕业论文答辩PPT模板
  8. Cogs 2382. [HZOI 2016]最佳序列
  9. 数据结构初阶:八大排序
  10. 公积金房贷计算器最新2014