[读书笔记[CoreJava2AdvancedFeatures][多线程]1.2中断线程



线程将在它的run方法返回时终止。在JDK1.0中,还存在一个stop方法,其它线程可以调用它来终止线程。不过这个方法现在已经被弃用了。我们将会在后面[线程安全的集合]给出解释。

尽管现在已经没有 强制 终止线程的方法了,但是你还是可以用interrupt方法来 请求 终止一个线程。

当interrupt方法在一个线程上被调用时,该线程的 中断状态 将会被置位。这是一个布尔类型的标志,存在于每一个线程之中。每个线程都应该不时地检查这个标志,以判断线程是否应该被中断。

为了查明中断状态是否被置位了,需要首先调用静态的Thread.currentThread方法来取得当前线程,然后调用它的isInterrupted方法:

while(!Thread.currentThread().isInterrupted()&& more work to do){
  do more work
}

尽管如此,如果一个线程被阻塞了,他就无法检查中断状态了。这就是产生InterruptedException异常的地方。当在一个被阻塞的线呈上调用interrupt方法时,阻塞调用就会被InterruptedException异常所终止。


没有任何语言方面的需求要求一个被中断的线程应该终止。中断一个线程只是为了引起该线程的注意,被中断线程可以决定应该如何应对中断。某些线程非常重要,以至于他们应该不理会中断,而是在处理完抛出的异常之后继续执行。但是更普遍的情况是,一个线程将把中断看作一个终止请求。这种线程的run方法遵循如下的形式:

public void run(){

     try{
        ...
        while(!Thread.currentThread().isInterrupted() && more work to do)
       {

             do more work
        }

     }
     catch(InterruptedException e)
     {
      // thread was interrupted during sleep or wait
     }
     finally
     {
         cleanup, if required
     }

     //exiting the run method terminates the thread
}

如果你在每次工作迭代之后都调用sleep方法,那么这个isInterrupted检查就不是必须的。如果你在中断状态被置位时调用sleep方法,那么sleep方法将抛出一个InterruptedException异常。因此,如果你循环调用sleep,就要花点心思检查中断状态并捕获InterruptedException异常。这样的run方法的形式如下所示:
public void run()
{
  try{
      ...
      while(more work to do)
      {
          do more work
          Thread.sleep(delay);
      }
  }
  catch(InterruptedException e)
  {
       //thread was interrupted during sleep or wait
  }
  finally
  {
      cleanup, if required
  }
// exiting the run method terminates the thread
}

警告:当sleep方法抛出一个InterruptedException异常时,它同时也会清除中断状态。

注意:有两个非常类似的方法,interrupted 和 isInterrupted。interrupted方法是一个静态方法,它检查当前线程是否已被中断。而且调用interrupted方法会清除该线程的中断状态。另一方面,isInterrupted方法是一个实例方法,可以用它来检查是否有线程已被中断了。调用它不会改变中断状态的值。

你会在很多发布的代码中发现InterruptedException异常被抑制在了一个很低的层次上,就像这样:
void mySubTask(){
...
try{sleep(delay);}
catch(InterruptedException e){} //Don't IGNORE!
...
}

不要这样做!如果你不能很好地在catch子句中处理异常,那么你还有两个合理的选择:
1)在catch子句中,调用Thread.currentThread().interrupt()来设置中断状态。然后调用这可以对其进行测试:

void mySubTask()
{
  ...
try{sleep(delay);}
catch(InterruptedException e){ Thread.currentThread().interrupt();}
...
}


2)或者更好的选择是,标记你的方法将抛出InterruptedExcetpion异常,不采用try语句块捕获异常。那么调用这(或者,最终的run方法)就能够捕获该异常。
void mySubTask() throws InterruptedException
{
...
sleep(delay);
...
}


  API java.lang.Thread 1.0

  • void interrupt() 发送一个中断请求给线程。这个线程的中断线程将被设为True。如果这个线程当前被一个sleep调用阻塞,那么将抛出一个InterruptedException异常。
  • static boolean interrupted() 检查当前线程(即正在执行该指令的线程)是否已经被中断了。注意,这是一个静态方法。对他的调用会产生副作用,它会将当前线程的中断状态设成false。
  • boolean isInterrupted() 检查一个线程是否已经被终止了。与static interrupted方法不同,这个调用不会改变线程的中断状态。
  • static Thread currentThread() 返回代表当前执行线程的Thread对象。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值