库调多了 都忘了最基础的概念 - 进程 / 线程篇

简介: 库调多了 都忘了最基础的概念 - 进程 / 线程篇

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家

📌 擅长领域:全栈工程师、爬虫、ACM算法

💒 公众号:知识浅谈

🔥 联系方式vx:zsqtcc

温馨提醒:此文涉嫌过度分享干货,请仔细阅读

🤞这次都给他拿下🤞

正菜来了⛳⛳⛳

🎈进程和线程有什么区别?

进程:进程是一个程序的运行,是资源的分配单位,如:QQ的运行。

线程:线程是一串指令码在cpu的运行,是cpu的调度单位。

  1. 进程具有自己的资源,线程占用的是进程的资源。
  2. 进程的上下文切换比较复杂,线程的上下文切换较为容易,因为进程切换要涉及虚拟地址空间的切换,而线程不涉及。
  3. 进程的通信:管道,队列,信号量,线程的通信:共享内存,如Object的wait notify,重入锁,semophone信号量,counntdown。

🎈有哪些创建线程的方法?推荐使用哪种?

  1. 通过继承Thread的方式创建线程
    重写run方法,
    调用start()方法开启一线程并执行
  2. 实现Runnable方法
    重写run方法,创建一个子类对象
    传递给Thread的对象,并调用start运行。
  3. 实现callable方法
    重写call方法,创建一个子类对象,并作为FutureTask的参数传入
    然后把创建的FutureTask作为参数传递给Thread的对象,并调用start运行。
class A implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "run";
    }
}
public class Main {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        A a = new A();
        FutureTask<String> vFutureTask = new FutureTask<>(a);
        Thread thread = new Thread(vFutureTask);
        thread.start();
        System.out.println(vFutureTask.get());
    }
}
  1. 使用线程池
    ExecutorService pools = Executors.newFixedThreadPool();
    pool.submit(实现run方法)

🎈为什么start方法不能重复调用?而run方法却可以?

首先start和run的区别,调用start的时候会先创建一个线程,然后在创建的线程中执行run方法,而直接调用run相当于在当前线程中执行run方法,并没有创建线程之后执行。

因为run方法是普通方法,start方法是线程创建的方法,普通方法可以执行多次,但是线程只能创建一次,所以start方法只能调用1次。

🎈说一下线程生命周期,以及转换过程?

线程的生命周期状态:New,Runable,Waiting,TimeWaiting,Blocked,Terminated

转换过程:

  1. 首先new之后,状态为New
  2. 调用start之后状态为Runnable
  3. 调用wait() join()之后状态为Waiting
  4. 调用wait(time),sleep(time) 之后状态为TimeWaiting
  5. Block这个转台比较特殊,是因为争夺monitor锁阻塞的状态
    如刚开始synchronized获取锁之后,调用wait()释放锁,然后又被其他线程调用notify()唤醒,但是此刻锁被其他线程占用,当前被唤醒的线程就是Blocked状态
  6. 线程执行结束之后的状态为Terminated

🎈为什么wait和notify必须放在synchronized中?

wait:因为wait是用来释放锁的,释放锁之前当前线程需要先获取锁。

notify:这个是用来唤醒waitset中的线程,你要唤醒别人,首先自己得有锁并且将要结束,采取唤醒别人。

所以两个都需要在有锁的状态下进行,而synchronized就是用来获取锁的

🎈sleep方法和wait方法有什么区别?

老生常谈了。

从几个方面来说吧

  1. sleep属于关键字,wait属于API
  2. sleep是Thread中的方法,而wait是Object中的方法
  3. sleep可以在任何代码中执行,但是wait只能在同步代码块中执行
  4. sleep按照规定的时间唤醒,但是wait可以使用notify,notifyall唤醒还可以设置时间自动唤醒
  5. 两个都可被interrrupt中断

🎈如何正确停止线程?

像之前的stop() suspend()这两种停止线程和悬挂线程都是弃用的状态,因为这两个是强制暂停和挂起线程的,如果其他线程要等待强制停止和挂起的线程的结果,像这种直接断掉,就一直等不到结果就会出现问题。

我们使用interrrupt()方法来中断,当然不是真正的中断,是把线程中断标志置为true,然后在要停止的线程中去查看中断标志,如果为true就结束线程。

这里有个主义的点就是,interrupt(),interrupted(),isInterrupted()

  • interrupt():表示用来把中断标志置为true
  • interrupted():表示用来查看中断标志并抹去中断标志就是变为false
  • isInterrupted() :表示用来查看中断标志但不抹去中断标志

🍚总结

相关文章
|
3月前
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
186 3
|
13天前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
230 2
|
13天前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
69 1
|
13天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
62 1
|
13天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
56 1
|
6月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
265 67
|
4月前
|
调度 开发工具 Android开发
【HarmonyOS Next】鸿蒙应用进程和线程详解
进程的定义: 进程是系统进行资源分配的基本单位,是操作系统结构的基础。 在鸿蒙系统中,一个应用下会有三类进程:
161 0
|
5月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
120 20
|
5月前
|
Linux 程序员 API
CentOS如何使用Pthread线程库
这就是在CentOS下使用Pthread线程库的全过程。可见,即使是复杂的并发编程,只要掌握了基本的知识与工具,就能够游刃有余。让我们积极拥抱并发编程的魅力,编写出高效且健壮的代码吧!
108 11
|
4月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
99 0

热门文章

最新文章