线程管理(四)操作线程的中断机制

简介:

操作线程的中断机制

在之前的指南里,你学习了如何中断执行线程和如何对Thread对象的中断控制。之前例子中的机制可以很容易中断的线程中使用。但是如果线程实现的是由复杂的算法分成的一些方法,或者它的方法有递归调用,那么我们可以用更好的机制来控制线程中断。为了这个Java提供了InterruptedException异常。当你检测到程序的中断并在run()方法内捕获,你可以抛这个异常。

在这个指南中, 我们将实现的线程会根据给定的名称在文件件和子文件夹里查找文件,这个将展示如何使用InterruptedException异常来控制线程的中断。

准备

指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。

怎么做呢

按照这些步骤来实现下面的例子::

1.   创建一个名为FileSearch的类,并一定要实现Runnable接口。


1 public class FileSearch implements Runnable {

2.   声明2个为private的属性,一个是为了我们要查找的文件名和另一个是为了初始文件夹。为这个类实现一个构造函数,并初始化这些属性。


1 private String initPath;
2 private String fileName;
3 public FileSearch(String initPath, String fileName) {
4    this.initPath = initPath;
5    this.fileName = fileName;
6 }

3.   为FileSearch类实现run()方法。 它会检测fileName属性是不是路径,如果它是,就调用processDirectory()方法。这个方法会抛出一个InterruptedException异常,所以我们应该要捕获它。


01 @Override
02 public void run() {
03 File file = new File(initPath);
04 if (file.isDirectory()) {
05   try {
06     directoryProcess(file);
07   } catch (InterruptedException e) {
08     System.out.printf("%s: The search has been interrupted",Thread.currentThread().getName());
09   }
10  }
11 }

4.   实现 directoryProcess()方法。这个方法会获取文件夹的文件和子文件夹并处理他们。对于每个路径,这个方法会传递路径作为参数来循环调用。对于每个文件,它会调用fileProcess()方法。处理完全部的文件和文件夹后,它会检查线程有没有被中断,在这个例子,会抛出一个InterruptedException异常。

01 private void directoryProcess(File file) throws
02 InterruptedException {
03  File list[] = file.listFiles();
04  if (list != null) {
05     for (int i = 0; i < list.length; i++) {
06        if (list[i].isDirectory()) {
07           directoryProcess(list[i]);
08        } else {
09           fileProcess(list[i]);
10        }
11    }
12 }
13 if (Thread.interrupted()) {
14      throw new InterruptedException();
15 }
16 }

5.   实现 processFile()方法。这方法会比较文件的名字与我们要搜索的文件名。如果他们一样,就写一条信息到控制台。比较完后,线程会检查有没有被中断,在这里,它会抛出一个InterruptedException异常。


1 private void fileProcess(File file) throws InterruptedException
2 {
3   if (file.getName().equals(fileName)) {
4      System.out.printf("%s : %s\n",Thread.currentThread().getName() ,file.getAbsolutePath());
5   }
6   if (Thread.interrupted()) {
7      throw new InterruptedException();
8   }
9 }

6.   现在, 让我们来实现例子的主类吧。实现一个Main类并包含main()方法。


1 public class Main {
2 public static void main(String[] args) {

7.   创建并初始一个FileSearch类的对象和一个执行它的任务的线程。然后,开始执行线程。


1 FileSearch searcher=new FileSearch("C:\\","autoexec.bat");
2 Thread thread=new Thread(searcher);
3 thread.start();

8.   等10秒然后中断线程。


1 try {
2    TimeUnit.SECONDS.sleep(10);
3 } catch (InterruptedException e) {
4    e.printStackTrace();
5 }
6 thread.interrupt();
7 }

9.   运行例子并查看结果。

它是怎么工作的

下面的截图给出了例子的执行结果。你可以发现FileSearch对象是如何执行的,当它检测到它被中断时。请看裁图:

在这个例子, 我们使用Java异常来控制线程的中断。当你运行这个例子,程序开始浏览文件夹来检查他们是否含有那个文件。例如,如果你输入\b\c\d,那么程序会循环调用3次processDirectory()方法。当它检测到被中断时,它会抛出InterruptedException异常并继续执行方法,无论已经多少次循环调用。

更多

InterruptedException 异常是由一些与并发API有关的Java方法,如sleep()抛出的。

参见

  • 第一章,线程管理:线程的中断指南
目录
相关文章
|
1月前
|
Java API 调度
线程的中断(interrupt)机制
线程的中断(interrupt)机制
30 1
|
1月前
|
人工智能 JSON 前端开发
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
【Spring boot实战】Springboot+对话ai模型整体框架+高并发线程机制处理优化+提示词工程效果展示(按照框架自己修改可对接市面上百分之99的模型)
|
1月前
|
资源调度 算法 Linux
Linux进程/线程的调度机制介绍:详细解析Linux系统中进程/线程的调度优先级规则
Linux进程/线程的调度机制介绍:详细解析Linux系统中进程/线程的调度优先级规则
93 0
|
10天前
|
监控 Java 关系型数据库
JVM工作原理与实战(十三):打破双亲委派机制-线程上下文类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了打破双亲委派机制的方法、线程上下文类加载器等内容。
14 2
|
20天前
|
安全 Java 调度
深入理解Java中的线程安全与锁机制
【4月更文挑战第6天】 在并发编程领域,Java语言提供了强大的线程支持和同步机制来确保多线程环境下的数据一致性和线程安全性。本文将深入探讨Java中线程安全的概念、常见的线程安全问题以及如何使用不同的锁机制来解决这些问题。我们将从基本的synchronized关键字开始,到显式锁(如ReentrantLock),再到读写锁(ReadWriteLock)的讨论,并结合实例代码来展示它们在实际开发中的应用。通过本文,读者不仅能够理解线程安全的重要性,还能掌握如何有效地在Java中应用各种锁机制以保障程序的稳定运行。
|
1月前
|
存储 开发框架 安全
【C++ 线程】深入理解C++线程管理:从对象生命周期到线程安全
【C++ 线程】深入理解C++线程管理:从对象生命周期到线程安全
88 0
|
1月前
|
Java
并发编程-线程等待唤醒机制
并发编程-线程等待唤醒机制
|
1月前
|
安全 Java 开发者
Java中的并发编程:探索线程安全与锁机制
【2月更文挑战第12天】 本文深入探讨Java并发编程的核心概念,特别是线程安全和锁机制。不同于传统的技术文章摘要,我们将通过一个实际案例来展开讨论,即如何在多线程环境下保证数据的一致性和完整性。我们将从基础的线程概念入手,逐步深入到synchronized关键字、显式锁(如ReentrantLock),以及其他并发工具类(如CountDownLatch、CyclicBarrier等)的应用。通过本文,读者不仅能够掌握Java并发编程的理论知识,还能了解到如何在实际开发中合理地应用这些并发机制,以提升应用程序的性能和稳定性。
19 2
|
1月前
|
安全 Java 程序员
Java中的并发编程:掌握同步机制与线程安全
【2月更文挑战第12天】 在现代软件开发领域,多线程和并发编程已成为提高应用性能和资源利用率的关键技术。Java语言提供了丰富的并发编程工具和框架,使得开发高效、可靠的并发应用成为可能。本文将深入探讨Java中的并发编程,着重介绍同步机制、线程安全概念及其在实际开发中的应用。通过对这些知识点的深入分析和案例演示,旨在帮助读者建立起对Java并发编程的全面理解,从而更好地设计和实现线程安全的高并发系统。
|
3月前
|
存储 算法 Linux
一起聊聊内核中的线程:操作函数、进程状态、task_struct、举个例子、
一起聊聊内核中的线程:操作函数、进程状态、task_struct、举个例子、
65 0

相关实验场景

更多