目录

Java多线程原理

你知道java中有几种方式实现一个线程?

  • 实现一个线程的话有三种方法,首先前面两种的话是比较常用的, 我们首先第一种,我们可以去实现我们的线程(Thread)类,然后第二种是实现我们的Runnable接口,那这两种方式的话,都是去重写我们的run方法, 然后还有我们的第三种,我们可以去实现我们的Callable一个接口,那这里面需要我们去实现的是一个call()方法,就这些。

创建线程池的方法

通过ThreadPoolExecutor类自定义

好处:避免使用重复的线程来创建线程产生的额外的开销。

线程池的七大参数

/img/Java多线程原理/img.png

/img/Java多线程原理/img_1.png

那线程池有用过吗?知道他有什么作用吗?

  • 线程池的话是为了解决我们这个突然爆发的一个线程,去大量爆发的线程去设计的嘛, 他是通过几个有限的一个、几个固定的线程,去给我们的一个大量的操作去服务的,他主要是要去减少我们的创建和销毁线程去需要的时间, 就是我们要提高我们的效率嘛,那我在项目里面用的过程中, 其实我是感觉说如果一个线程所需要执行的时间非常长的话,其实没有必要用这个线程池的。 因为我觉得这个并不是说线程池他不能长时间去操作,而是我感觉不适合嘛,因为我们本来要降低这个线程创建的销毁, 结果这个线程呢,他如果时间很久的话还不好控制,所以还不如直接去创建线程,因为我们是不能直接控制线程池里面的线程的开始啊挂起啊终止啊这些状态的嘛。

Java多线程

多线程带来了什么问题,如何避免?

/img/Java多线程原理/多线程问题.png

线程安全问题

例如:银行存钱取件需要完整,不可出现错误。

保证线程安全需要满足两大条件:

  • 原子性:一系列操作,要么全部完成,要么全部不完成,不可被分割,不会结束在中间某个环节。
  • 可见性:当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。

上下文切换

  1. 线程与 CPU 单核执行是一对一的
  2. CPU 是通过时间片算法来执行任务的,不同的线程活跃状态不同,CPU 会在多个线程间切换执行, 在切换时会保存上一个任务的状态,以便下次切换回这个任务时可以再加载到这个任务的状态
  3. 线程数越多,带来的上下文切换越严重,上下文切换会带来 CPU 系统态使用率占用
  4. 这就是当我们开启大量线程,系统反而更慢

解决办法

  1. 减少锁等待
  2. 使用合适的线程数
  3. CAS 算法

死锁

/img/Java多线程原理/死锁.png

  • 就是比如说,我们有两个或者两个以上的这个进程或者线程,都在等待对方释放资源的话,那其实没有一方提起这个释放资源的操作的话呢,就从而造成了一种阻塞的现象, 这个称之为死锁。结果就是说我们两个进程或者两个线程他们都会陷入到一个无限等待中, 我也可以简单的说一下,就是,就是面试官您给我说,如果我回答上这个问题的话,你就给我这个offer, 那如果玩说如果你给我这个offer的话,我就回答您这个问题,那咱俩都在等待对方释放这个锁嘛,那这样就造成了一个死锁问题,就是这样的。

java中如何保证线程安全

/img/Java多线程原理/1.png