浅谈线程(池)

浅谈—线程(池)

  • 线程概述
  • 线程的实现方式
  • 线程池
  • 线程同步

一、线程概述

1、*什么是进程:*简单通俗来说就是,一个正在运行的程序或者软件,有自己独立的数据空间和指令序列。多个进程在普通PC中通过不断的快速的切换CPU的使用权,达到一种“并发”的效果;
2、什么是线程 在进程中的一条执行线索,称为一个线程,一个进程中可以有多个线程,线程间共享进程的数据资源(具体是共享哪些资源可以看一下其他大佬的分享,这里不多解释了);
3、线程的状态和生命周期:
(1)新建态:当使用Thread类创建一个对象时,这个对象称为线程,此时线程会被分配内存资源,不能执行;
(2)就绪态:当使用一个线程对象调用start()方法时,线程进入就绪队列,处于就绪状态。等待CPU的时间片,线程就进入运行态;
(3)运行态:虚拟机 执行run方法,这时候线程就处于运行的状态,然后在执行过程中如果遇到阻塞/挂起,线程就进入阻塞/挂起状态,线程还是活动的,有机会重新进入就绪状态。如果线程执行过程中没有遇到阻塞或者挂起,可以进入终止态 ;
(4)阻塞/挂起态:当一个运行的线程,在执行过程中如果调用了sleep、wait、join、suspend,被阻塞或者挂起,处于阻塞/挂起态的线程依然是活动的;
(5)终止态:当一个线程的run方法执行完毕,自动进入终止态;或者在执行过程中调用interrupted或者stop时,线程会进入终止态,没有机会再次执行;
4、线程的分类:
分为用户线程和守护线程:
用户线程运行在系统前台,守护线程运行在系统的后台,
守护线程的声明周期比用户线程长,

二、线程的实现方式

1、继承Thread类:重写run方法,类的对象即是一条线程。

2、实现Runnable接口:类的对象是某一个线程索要完成的任务,该对象被封装到Thread类的对象中就是一个线程。

对于这两种方式:thread是多个线程分别完成自己的任务,runnable是多个线程共同完成一个任务。其实在实现一个任务用多个线程来做也可以用继承Thread类来实现只是比较麻烦,一般我们用实现Runnable接口来实现,简洁明了;

另外需要注意的是:

  • 线程的优先级:最高 10 默认 5 最低 1 ,但是,不要想着通过设置线程的优先级来决定哪个线程优先执行,具体执行的前后顺序看具体应用场景,由程序编写情况控制;
  • 线程的行为方法:public void run():程序不能直接调用,应该由虚拟机调用
  • start()方法:只是将线程由新建态转换到就绪态,并不是启动线程,当线程的时间片到来时,虚拟机执行run方法,才是线程启动(运行态);

三、线程池

线程池,从字面含义来看,是指管理一组同构工作线程的资源池。线程池是与工作队列密切相关的,其中在工作队列中保存了所有等待执行的任务。工作线程的任务很简单:从工作队列中获取一个任务,并执行任务,然后返回线程池并等待下一个任务。(线程池介绍不够多,见谅)

/*简单说明*/
ThreadPoolExecutor
(
	int corePoolSize, //核心线程数
	int maximumPoolSize, //最大线程数
	long keepAliveTime, //非核心线程空闲时存活的时间
	TimeUnit unit, //时间单位
	BlockingQueue< Runnable > workQueue, //阻塞队列
	ThreadFactory threadFactory, //线程工厂
	RejectedExecutionHandler handler//当核心线程和非核心线程以及队列都满的情况下,拒绝的策略
) 

2、线程池的工作流程:

  1. 默认情况下,创建完线程池后并不会立即创建线程, 而是等到有任务提交时才会创建线程来进行处理。(除非调用prestartCoreThread或prestartAllCoreThreads方法)
  2. 当前线程数小于核心线程数时,每提交一个任务就创建一个线程来执行,即使当前有线程处于空闲状态,也会创建,直到当前线程数达到核心线程数。
  3. 当前线程数达到核心线程数时,如果这个时候还在提交任务,这些任务会被放到队列里,等到当前使用中的线程处理完了手头的任务后,会来队列中取任务处理。
  4. 当前线程数达到核心线程数并且队列也满了,如果这个时候还提交任务,则会继续创建线程来处理,直到线程数达到最大线程数。
  5. 当前线程数达到最大线程数并且队列也满了,如果这个时候还提交任务,则会触发饱和策略。
  6. 如果某个线程的空线时间超过了keepAliveTime,那么将被标记为可回收的,并且当前线程池的当前大小超过了核心线程数时,这个线程将被终止。

四、线程同步

   多个线程对共享资源数据的争用时采用的一种安全策略。
   当一个线程运行并使用共享资源时,共享资源被当前线程锁定,直到共享资源的同步方法或者同步块执行结束才释放同步锁,称为线程同步。
   在java中线程同步指的是给共享资源加同步锁。使用synchronized关键字修饰方法或者方法中的代码段;
  	//同步方法
  public synchronized void fun(){
           
  }
	//同步块
  public  void fun(){
  	.................
  	synchronized(obj){
  	
  	}
  	...............
  }

线程同步使用的场景:

(1)票务系统
(2)生产者和消费者

本人简单整理的有关线程的部分知识点,如有错误欢迎指正,一起进步~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值