进程、线程、线程池 基础知识

本文详细讲解了进程、线程、线程池的基础知识,包括多线程的实现方式、线程安全、线程间通信、避免死锁的策略、线程池的类型及使用方法。探讨了如何利用线程池提高任务执行效率,避免资源浪费。

进程、线程、线程池 基础知识

多线程

高效的完成某项任务

1.实现多线程的方式

继承 Thread 类 或 实现 Runnable 接口

2.start()和run()有什么不同

start()通知「线程调度器」线程已准备就绪,run()执行 启动好线程

3.线程执行式无序的

有序的输出可以使用synchronized来标记run()方法

4.线程安全

使用 Synchronized 关键字,对 方法对象 加锁

Synchronized 防重入的同步锁

public static class SingleInstance{
	public static SingleInstance sInstance;
	pubiic static SingleInstance getInstacne(){
		if(sInstance==null){
			synchronized(SingleInstance.class){
				if(sInstance==null){
					sInstance=new SingleInstance();
				}
			}
		}
		return sInstance;
	}
}

5.安全停止线程(推荐使用)

Thread.interrupt()停止一个线程

Thread.interrupted()检查当前运行这段代码的线程,是否已经被停止

this.isInterrupted()检查当前this指定的线程,是否已经被停止

6.线程间通信之等待、通知 ----“好了,我叫你”

等待wait 、通知noticy(Java自己的)–“好了,我叫你”

  • notify()并不立即释放锁,而是会优先执行完当前的同步代码,再释放锁并通知出去。

  • wait()会立即放弃锁,进入等待状态

wait/notify的缺陷:等死 wait(timeout)>>notifyAll()

7.避免死锁

单一职责

使用lock.tryLock(timeout)来替代使用的同步锁

对于数据库锁,加锁和解锁必须在一个数据库连接中

8.非安全停止线程(不推荐使用)

stop()

9.其它方法

currentThread()``````isAlive()``````sleep()``````getId()

线程池

问题:频繁地为每一个任务创建一个线程,缺乏统一管理,降低性能,并且容易出现问题。

一、线程池好处

  • 对多个线程进行 统一 管理,避免资源竞争而出现的问题

  • 对线程进行 复用,线程在执行完任务之后,不会立即销毁,而会等待另外的任务,避免频繁创建、销毁线程 和调用GC

  • Java提供一套完整的ExecutorService线程池创建的api,可创建多种 功能不一样 的线程池,方便使用

二、基本线程池

  • ThreadPoolExecutor
  • FixedThreadPool (可重用固定线程数)

适用:执行长期的任务,性能好很多

  • CachedThreadPool (按需创建)

适用:执行很多短期异步的小程序或者负载较轻的服务器

  • SingleThreadPool(单个核线的fixed)

适用:一个任务一个任务执行的场景

  • ScheduledThreadPool(定时延时执行)

适用:周期性执行任务的场景

  • 自定义PriorityThreadPool(队列中有优先级比较的线程池)

三、Java中的阻塞队列

ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。

LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。

PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。

DelayQueue:一个使用优先级队列实现的无界阻塞队列。

SynchronousQueue:一个不存储元素的阻塞队列。

LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。

LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

###四、线程池的其它方法

1.shutDown()  关闭线程池,不影响已经提交的任务

2.shutDownNow() 关闭线程池,并尝试去终止正在执行的线程

3.allowCoreThreadTimeOut(boolean value) 允许核心线程闲置超时时被回收

4.submit 一般情况下我们使用execute来提交任务,但是有时候可能也会用到submit,使用submit的好处是submit有返回值。

5.beforeExecute() - 任务执行前执行的方法

6.afterExecute() -任务执行结束后执行的方法

7.terminated() -线程池关闭后执行的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄毛火烧雪下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值