【2022.6.6】Java线程的优化--线程池

线程优化

线程的优化:线程池

原因

每一个线程大约占1mb的内存,但是线程的回收却需要等到run方法中的代码执行完毕后,等待GC回收
因为线程和线程任务可以分离,那么当一个线程执行完一个线程任务后,能不能使其执行下一个线程任务(线程的复用)

线程池是什么?

一个存放线程的容器

线程池的优点

可以帮助我们管理线程,包括但不限于线程的创建,销毁,复用等

线程池的体系

Executor:线程池的顶级
	方法:
	void execute (Runnable command);提交线程所需执行的任务
	子接口:
	ExecutorService
		方法:
			void shutdown();关闭线程池
			boolean isShutdown();判断线程池是否关闭
			<T> Future<T> submit(Callable<T> task);提交任务
			 <T> Future<T> submit(Runnable task, T result);提交任务
	ScheduledExecutorService
		方法:
			public ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit);
			延迟多长时间后执行该任务
			Runnable command:要执行的任务
			long delay 延期时间单位
			TimeUnit unit 延期时间的单位
		    public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit);
		    延迟多久后,间隔多久重复执行任务
		    Runnable command:要执行的任务
			long initialDelay 延期时间单位
			long period 重复间隔执行时间
			TimeUnit unit 延期时间的单位
			long period:前一次任务开始时间,与下一次任务开始时间的间隔
			特殊情况:前一次执行任务时间大于间隔时间,则也会等待运行完后再重复
			 public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,             long initialDelay,                                   long delay,                                         TimeUnit unit);
			  Runnable command:要执行的任务
			  long initialDelay 延期时间单位
			  long delay 重复间隔执行时间
			  TimeUnit unit 延期时间的单位
			  long delay:前一次任务结束时间,与下一次任务开始时间的间隔

如何创建线程池 Executors

固定线程池:
	特点:线程池中线程数量固定
	Executors.newFixedThreadPool(nThreads);
	//(nThreads)是固定几条线程
	注:该线程池的线程是前台线程
		固定线程池关闭时,需要等待所有任务执行完毕后才会关闭
		ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
		注:该线程池的线程是前台线程
			需要等待所有任务执行完毕后才会关闭;
可变线程池:
	特点:线程池中线程数量不固定
		需要等待所有任务执行完毕后才会关闭;
单例线程池:
	特点:线程池中只有一个线程
	ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
	需要等待所有任务执行完毕后才会关闭;
调度线程池:
	特点:间隔(按照开始/结束时间/延迟一段时间后再次执行一次线程任务
	ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(corePoolSize[数量]);
	当关闭线程池时,不管任务是否执行完毕,都会关闭线程池.
延迟线程池:
单例延迟线程池(了解):
	特点:线程池中只有一个线程,延迟多久后执行
	ScheduledExecutorService newSingleThreadScheduledExecutor= Executors.newSingleThreadScheduledExecutor();
抢占线程池(了解):
	特点:多个线程可以执行一个任务,处理较为耗时的任务,1.8出现的,窃取算法
	

线程任务的优化:回调

callable接口

与runnable的区别
	1.callable有返回值的,重写call方法,call方法有异常的声明,只能使用线程池对象使用
	2.Runnable没有返回值,重写run方法,run方法没有异常声明,可以使用thread

callable接口的方法

get();	//获取返回值,并且会堵塞当前的线程,直到获取到返回值

锁的优化:Lock

原因

synchronized的使用不够方便,不够灵活,所以对其进行了优化

体系

lock
	方法:
	void lock();	//上锁
	boolean tryLock();	//判断是否上锁了
	void unlock();	//释放锁
	子类:
		ReentrantLock	//重入锁
		ReentrantReadWriteLock  //重读锁
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值