Java 多线程 与 线程池

1. Java 中线程的生命周期

该java.lang.Thread的类包含一个静态枚举-它定义了它的潜在状态。在任何给定的时间点,线程只能处于以下状态之一:

  • NEW:新创建的线程尚未启动执行
  • RUNNABLE:运行或准备执行,但它正在等待资源分配
  • BLOCKED:等待获取监视器锁定以进入或重新进入同步块/方法
  • WAITING:等待其他一些线程执行特定操作,没有任何时间限制
  • TIMED_WAITING:等待某个其他线程在指定时间段内执行特定操作
  • TERMINATED:已完成执行

2. 创建 Java 线程的三种方法

  • 第一种是创建 Thread 子类的一个实例并重写 run 方法
  • 第二种是实现 Runnable 接口
  • 第三种是实现 Callable 接口

实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以说任务是通过线程驱动从而执行的。

3. 实现接口 VS 继承 Thread

实现接口会更好一些,因为:

  • Java 不支持多重继承,因此继承了 Thread 类就无法继承其它类,但是可以实现多个接口;
  • 类可能只要求可执行就行,继承整个 Thread 类开销过大。

4. Runable 和 Callable 的比较

  • 与 Runnable 相比,Callable 可以有返回值,返回值通过 Future 进行封装。
  • 由于 Runable 的 run() 方法没有指定“throws”子句,因此无法传播进一步检查的异常;
    Callable的call()方法包含“throws Exception”子句,因此我们可以轻松地进一步传播已检查的异常.。

5. 使用线程池

线程池模式有助于节省多线程应用程序中的资源,还可以在某些预定义的限制内包含并行性。

使用线程池时,以并行任务的形式编写并发代码,并将它们提交给线程池的实例执行。此实例控制多个重用线程以执行这些任务。

合理使用线程池能带来 3 个好处:

  • 降低资源消耗
  • 提高响应速度
  • 提高线程的可管理性

下面再介绍下线程池的运行状态. 线程池一共有五种状态, 分别是:

  • RUNNING :能接受新提交的任务,并且也能处理阻塞队列中的任务;

  • SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保存的任务。在线程池处于 RUNNING 状态时,调用 shutdown()方法会使线程池进入到该状态。(finalize() 方法在执行过程中也会调用shutdown()方法进入该状态);

  • STOP:不能接受新任务,也不处理队列中的任务,会中断正在处理任务的线程。在线程池处于 RUNNING 或 SHUTDOWN 状态时,调用 shutdownNow() 方法会使线程池进入到该状态;

  • TIDYING:如果所有的任务都已终止了,workerCount (有效线程数) 为0,线程池进入该状态后会调用 terminated() 方法进入TERMINATED 状态。

  • TERMINATED:在terminated() 方法执行完后进入该状态,默认terminated()

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值