线程池及Executor框架

线程池就是一个可以复用线程的技术,可以提高线程的利用率。

线程池的好处:

1.避免因为线程的创建和销毁带来的性能开销

2.有效控制线程池的最大并发数,避免大量的线程之间因抢占系统资源而阻塞

3.能够对线程进行简单的管理,并提供以下特定的操作:定时、定期、单线程、并发数控制等功能

线程池可能带来的风险:

1.死锁

2.资源不足(一般是由于线程池设置过大,需要合理设置线程池大小)

3.并发错误,线程池和其他排队机制依靠使用wait()和notify()方法,这两个方法都难于使用。如果编码不正确,可能丢失通知,导致线程保持空闲状态,尽管队列中有工作要处理。

4.线程泄露,任务抛出一个RuntimeException或一个Error时。如果池类没有捕捉到它们,那么线程只会退出而线程池的大小将会永久减少一个。当这种情况发生的次数足够多时,线程池最终为空,系统将停止(因为没有可用的线程来处理任务)。

5.请求过载,线程池任务队列中,待执行的任务堆积过多,消耗太多的系统资源并引起资源缺乏。

Executor框架:

Executor 框架Java 5中引入的,其内部使用了线程池机制,它在 java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过 Executor 来启动线程比使用 Thread start 方法更好,更易管理,效率更好(用线程池实现,节约开销)
Eexecutor 作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务的线程相当于消费者,并用Runnable来表示任务, Executor 的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。
Executor 框 架 包 括 : 线 程 池 , Executor Executors ExecutorService CompletionService Future Callable 等。

Executor:

个接口,其定义了一个接收 Runnable 对象的方法 execute
方法签名是: execute(Runnable command)
该方法接收一个 Runable 实例,它用来执行一个任务
一般来说, Runnable 任务开辟在新线程中的使用方法为: new Thread(new RunnableTask())).start()
但在 Executor 中,可以使用Executor而不用显示地创建线程: executor.execute(new RunnableTask()) ;
Executor 接口并不严格要求执行是异步的。

在我们使用线程池来执行一些任务时,线程池提供了两个常用的方法,即execute()和submit()。它们都可以用来提交任务,但在使用时需要注意它们之间的区别。

execute是Executor接口中声明的抽象方法,在ThreadPoolExecutor类中有具体实现。execute方法用于提交不需要返回值的任务,它将任务提交到线程池中执行,并立即返回不会等待任务执行完成如果任务执行过程中出现异常,线程池将捕获异常并将其记录下来。其他线程继续执行新任务。

submit是ExecutorService接口的方法,在AbstractExecutorService抽象类中已经有具体实现。submit方法用于提交需要返回值的任务,它会返回一个Future对象,可以用来获取任务执行结果。submit方法会将任务提交到线程池中执行,并立即返回,但不会阻塞当前线程,它会立即返回一个Future对象,通过该对象可以获取任务执行结果。如果任务执行过程中出现异常,submit无提示,其他线程继续执行。想要捕获异常信息需要通过Future对象的get()方法将会抛出异常。

需要注意的是,submit方法可以用于提交Callable任务和Runnable任务,而execute方法只能用于提交Runnable任务。因此,如果需要执行一个Callable任务并获取其结果,必须使用submit方法。

阻塞队列:

阻塞队列是一种特殊的队列,支持在队列为空时阻塞等待,或队列已满时阻塞等待。

java.util.concurrent包提供了多种类型的阻塞队列,例如ArrayBlockingQueue、LinkedBlockingQuere、SynchronousQueue等。

阻塞队列特性:

1.支持阻塞等待:当队列为空或满时,从队列中获取或添加元素的操作会被阻塞,直到队列中有新的元素或空间可用。

2.线程安全:多个线程可以同时访问同一个阻塞队列。

3.FIFO顺序:先进先出的顺序

4.支持多种操作:包括添加、移除、检查等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值