文档章节

多线程之线程部分

Arno_pei
 Arno_pei
发布于 07/09 21:28
字数 1684
阅读 46
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

① 进程与线程

程序、进程、线程、协程的概念

  • 程序: 用某种语言编写的一组指令的集合,即指一段静态的代码;
  • 进程:简单地说就是一个正在执行的程序或应用,是资源分配的最小单位;
  • 线程:线程是进程的一部分,是在进程中执行的一个任务,可以称之为是轻量级进程
  • 协程:协程是轻量级的线程,协程的性能得到了很大的提升,不会像线程切换那样消耗资源;

面试题:进程和线程之间有什么不同?

  • 进程是一个运行中的程序,是系统进行资源分配和调度的一个独立单位;
  • 线程是进程的一部分,一个进程一般包含多个线程,线程之间共享进程中的地址空间和其他资源;
  • 线程一般不拥有系统资源,上下文切换时,线程比进程快很多;

 

② 线程实现的方式

面试题:多线程的实现方式?

多线程的实现方式有4种:前两种重点掌握

  • 继承 Thread类创建线程(要覆写run()方法
  • 实现Runnable接口创建线程 (同样要覆写run();推荐此方式
  • 覆写Callable接口实现多线程(JDK1.5;核心方法是call()方法

  • 通过线程池启动多线程

参考链接:https://blog.csdn.net/weixin_41891854/article/details/81265772

 

③ 线程的状态变化

3.1 面试题:线程的生命周期

线程的状态包括 新建状态,运行状态,阻塞等待状态和消亡状态。其中阻塞等待状态又分为BLOCKED(阻塞), WAITING(等待)和TIMED_WAITING(超时等待)状态。

所有的状态如下所示:

 

3.2 面试题:sleep和wait的区别?

sleep方法:让当前线程进入睡眠状态一段时间,时间到后,自动解除阻塞状态,进入可运行状态。睡眠过程中不释放锁

wait方法:让线程进入睡眠状态,需要调用notify或notifyall方法来唤醒线程。睡眠过程会释放锁

 

⑥ 同步以及死锁

6.1 线程安全

面试题:线程安全的定义

多个线程访问某个类时,

  • 不管运行时环境采用何种调度方式
  • 或者这些线程将如何交替执行
  • 并且在主调代码中不需要任何额外的同步或协同

这个类都能表现出正确的行为,那么这个类就是线程安全的。

参考链接:https://blog.csdn.net/qq_36688143/article/details/86488438

 

面试题:线程安全产生的原因和解决方案

线程安全产生的根本原因:

  • 必须要存在两个或者两个以上的线程共享着一个资源
  • 操作共享资源的代码必须有两句或者两句以上 ;

解决方案:

说明:

  • 同步代码块的锁可以是任意的对象。 同步函数的锁是固定的,非静态函数的锁对象是this对象,静态函数的锁对象是class对象。
  • 锁对象必须是多线程共享的对象,否则锁不住。
  • 在同步代码块或者是同步函数中调用sleep方法是不会释放锁对象的,如果是调用了wait方法是会释放锁对象的。

参考链接:https://www.cnblogs.com/loaderman/p/9994203.html

 

⑦ 线程池

参考链接:https://www.cnblogs.com/jiawen010/p/11855768.html

参考链接:https://www.jianshu.com/p/7726c70cdc40

7.1 面试题:什么是线程池?如何创建一个 Java 线程池?

  • 一个线程池管理了一组工作线程,同时它还包括了一个用于放置等待执行的任务的队列。
  • java.util.concurrent.Executors 提供了一个 java.util.concurrent.Executor 接口的实现用于创建线程池。

7.2 面试题:线程池的组成

一个线程池包括四个基本部分 :

1.线程管理池(ThreadPool):用于创建并管理线程池,有创建,销毁,添加新任务;
2.工作线程(PoolWorker):线程池中的线程在没有任务的时候处于等待状态,可以循环的执行任务;
3.任务接口(Task):每个任务必须实现接口,用来提供工作线程调度任务的执行,规定了任务的入口以及执行结束的收尾工作和任务的执行状态等;
4.任务队列(等待队列):用于存放没有处理的任务,提供一种缓存机制。

 

7.3 面试题:线程池的分类

常见线程池一共分为4类:

  •  1.CachedThreadPool(可缓存的线程池)
    • 核心线程池大小为0,最大线程池大小不受限,来一个创建一个线程 ;
    • 适合用来执行大量耗时较短且提交频率较高的任务
  •  2.SecudleThreadPool(周期性执行任务的线程池)
  •  3.SingleThreadPool(单线程线程池)
    • 便于实现单(多)生产者-消费者模式 ;
  •  4.FixedThreadPool(定常的线程池)
    • 固定大小的线程池 ;
    • 当线程池大小达到核心线程池大小,就不会增加也不会减小工作者线程的固定大小的线程池 ;

 

7.4 面试题:线程池的参数

  • corePoolSize:核心线程数
  • maximumPoolSize:最大线程数
  • keepAliveTime :线程空闲但是保持不被回收的时间
  • unit:时间单位
  • workQueue:存储线程的队列 - 用于传输和保存等待执行任务的阻塞队列
  • threadFactory:创建线程的工厂 - 用于创建新线程
  • handler:拒绝策略 - 当线程池和队列都满了,再加入线程会执行此策略

 

7.5 线程池的执行流程

  •   1 先判断线程池中的核心线程们是否空闲,如果空闲,就把这个新的任务指派给某一个空闲线程去执行。如果没有空闲,并且当前线程池中的核心线程数还小于 corePoolSize,那就再创建一个核心线程。
  •   2 如果线程池的线程数已经达到核心线程数,并且这些线程都繁忙,就把这个新来的任务放到等待队列中去。
  •   3 如果等待队列又满了,那么 查看一下当前线程数是否到达maximumPoolSize,如果还未到达,就继续创建线程。如果已经到达了,就交给RejectedExecutionHandler来决定怎么处理这个任务 。

 

 

 

 

上一篇: 多线程之java锁
下一篇: ThreadLocal
Arno_pei
粉丝 2
博文 86
码字总数 83692
作品 0
杭州
私信 提问
加载中
请先登录后再评论。
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.6K
16
Password Manager Daemon

pwmd(Password Manager Daemon) 通过 Unix domain socket 提供服务,数据存储在加密的 XML 文件中,客户端必须提供密钥才能修改。支持多线程,可同时允许多个客户端同时连接。 特性 通过 ...

匿名
2013/03/12
441
0
OSX游戏模拟器--Open Emu

OpenEmu 是一项开源计划,目的是将游戏模拟带入OS X,使用Cocoa、Core Animation和Quartz等现代OS X技术,使用Sparkle进行自动升级。 Open Emu使用模块化构架,支持游戏引擎插件,这意味着O...

匿名
2013/04/10
1.6W
3
阿里云开放存储服务的C语言SDK--OSSC

OSSC(Aliyun Open Storage Service C SDK)为阿里云开放存储服务(OSS)提供了一套完整易用的C SDK。 OSSC完全采用C语言开发,并实现了类似面向对象的调用方式,遵循了良好的编码规范,目前O...

大卷卷
2012/10/22
4.6K
0
高性能异步网络服务框架--libgod

libGod是一个全异步+协程机制实现的网络库,适用于windows、linux、bsd等多种平台。内部使用IOCP、epoll、kqueue等系统调用管理事件机制,同时巧妙的利用协程,将复杂的异步逻辑转换为同步,...

libGod
2012/11/09
6.8K
6

没有更多内容

加载失败,请刷新页面

加载更多

【实用技巧】MAC苹果电脑怎么远程?

一般电脑远程包括三方面: 1、如果从外部windows或者linux终端连接到mac苹果电脑; 2、从苹果电脑内如何远程外面的windows、linux和mac等; 3、苹果和安卓手机怎么远程连接苹果/Windows电脑。...

osc_doeya1ck
48分钟前
22
0
虚拟主机和VPS主机有哪些不同点呢

虚拟主机是一种在单一主机或主机群上,实现多网域服务的方法,可以运行多个网站或服务的技术。vps主机是将一台服务器分割成多个虚拟专享服务器的服务。实现VPS的技术分为容器技术和虚拟机技术...

osc_b88oux8w
49分钟前
19
0
合理的使用MySQL乐观锁与悲观锁

针对 MySQL的乐观锁与悲观锁的使用,基本都是按照业务场景针对性使用的。针对每个业务场景,对应的使用锁。 但是两种锁无非都是解决并发所产生的问题。下面我们来看看如何合理的使用乐观锁与...

php开源社区
50分钟前
9
0
fusionpbx 中文 汉化

  自己以前有从事过呼叫中心的工作经验,然而由于自己是从事后端开发,对于前端界面的开发还是有些吃力,但是自己却又想自己搭建一套呼叫中心,所以购买了一台云服务器并克隆了FusionPBX的...

osc_ydeb2o99
51分钟前
12
0
关于大O表示法和小O表示法

上节课老师讲了一下各种表示法,当时没咋听懂,后来查了一些资料弄懂了,记录一下。 主要是从维基百科上看的。http://en.wikipedia.org/wiki/Big_O_notation 大O表示法: f(x) = O(g(x)) 表示...

osc_3mzamgkq
52分钟前
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部