《Java程序员面试秘笈》—— 1.4 线程的中断

1.4 线程的中断

如果一个Java程序有不止一个执行线程,当所有线程都运行结束的时候,这个Java程序才能运行结束;更确切地说应该是所有的非守护线程运行结束时,或者其中一个线程调用了System.exit()方法时,这个Java程序才运行结束。如果你想终止一个程序,或者程序的某个用户试图取消线程对象正在运行的任务,就需要结束这个线程。

Java提供了中断机制,我们可以使用它来结束一个线程。这种机制要求线程检查它是否被中断了,然后决定是不是响应这个中断请求。线程允许忽略中断请求并且继续执行。

在本节中,我们将开发程序来创建一个线程,使其运行5秒钟后再通过中断机制强制使其终止。

准备工作
本节的范例是在Eclipse IDE里完成的。无论你使用Eclipse还是其他的IDE(比如NetBeans),都可以打开这个IDE并且创建一个新的Java工程。

范例实现
按照接下来的步骤实现本节的范例。

1.创建一个名为PrimeGenerator的类,并继承Thread类。
``
public class PrimeGenerator extends Thread{``
2.覆盖run()方法,并在方法体内包含一个无限循环。在每次循环中,我们将处理从1开始的连续数。对每个数字,我们将计算它是不是一个质数,如果是的话就打印到控制台。

@Override
public void run() {
  long number=1L;
while (true) {
  if (isPrime(number)) {
    System.out.printf("Number %d is Prime",number);
}```
3.一个数字处理完后,调用isInterrupted()方法来检查线程是否被中断。如果isInterrupted()返回值是true,就写一个信息并且结束线程的执行。
if (isInterrupted()) {
  System.out.printf("The Prime Generator has been Interrupted");
    return;
}
number++;

}
}`
4.实现isPrime()方法。isPrime()方法返回的是一个布尔值,如果接收到的参数是一个质数就返回true,否则就返回false。

private boolean isPrime(long number) {
  if (number <=2) {
   return true;
  }
  for (long i=2; i<number; i++){
    if ((number % i)==0) {
      return false;
    }
  }
  return true;
}```
5.现在我们来实现这个范例的主类Main,并且实现main()方法。

public class Main {
public static void main(String[] args) {`
6.创建PrimeGenerator类的一个对象,并且运行这个线程对象。

Thread task=new PrimeGenerator();
task.start();```
7.等待5秒钟后,中断PrimeGenerator线程。

try {
Thread.sleep(5000);
} catch (InterruptedException e) {

e.printStackTrace();

}
task.interrupt();`
8.运行范例并查看结果。

工作原理
下面的截屏记录了上述范例的运行结果。通过这个图我们可以看到PrimeGenerator线程打印出的信息,并且看到当它被中断后就运行终止了。

Thread类有一个表明线程被中断与否的属性,它存放的是布尔值。线程的interrupt()方法被调用时,这个属性就会被设置为true。isInterrupted()方法只是返回这个属性的值。

更多信息
还有一个方法可以检查线程是否已被中断,即Thread类的静态方法interrupted(),用来检查当前执行的线程是否被中断。

isInterrupted()和interrupted()方法有一个很大的区别。isInterrupted()不能改变interrupted属性的值,但是后者能设置interrupted属性为false。因为interrupted()是一个静态方法,更推荐使用isInterrupted()方法。

像之前提到的,线程可以忽略中断,但并不是预期的行为。

时间: 2024-10-28 04:38:11

《Java程序员面试秘笈》—— 1.4 线程的中断的相关文章

《Java程序员面试秘笈》—— 面试题11 使用jar命令

面试题11 使用jar命令 Java程序员面试秘笈 请使用jar命令,将test文件夹压缩成.jar文件,并简述其压缩包的结构. 考点:对于Java程序员来说,更多情况下是使用的集成Java开发工具,例如JBuilder.Eclipse等,而对于最基本的Java编译和常见的命令行工具往往都不熟悉.这个面试题主要考察求职者对于Java命令行基本工具的使用,从而了解求职者对Java编程的熟悉程度. 出现频率: [面试题解析]熟练的Java开发者应该掌握常用的Java命令行工具.求职者应该熟练掌握ja

《Java程序员面试秘笈》—— 面试题12 如何执行mian()方法

面试题12 如何执行mian()方法 Java程序员面试秘笈 利用Java SDK中哪一条命令能够执行test的main()方法? (a)java test (b)javac test (c)java test.java (d)java test.class (e)java test.main 考点:考察求职者对java命令的熟悉程度. 出现频率: [面试题解析]求职者容易出现的错误是选择了(d).实际上,java命令后面只需要class文件的名称就可以,不用加入.class全名.如果使用jav

《Java程序员面试秘笈》—— 面试题10 类继承的建模表示方法

面试题10 类继承的建模表示方法 Java程序员面试秘笈根据图1.4的UML表示,选择一个正确的描述. (a)Box类是MyBox类的子类. (b)Box类是MyBox类的父类. (c)Box类和MyBox类是聚合关系. (d)Box类和MyBox类是一对多关系. 考点:该面试题貌似简单,在实际的面试中回答正确的却并不是很多,其实只是考察求职者对类的继承的建模表示方法的掌握程度. 出现频率: [面试题解析]Java中有两种机制来保证根据现有的类来构造新的类,那就是继承和聚合.例如,有一个盒子的类

《Java程序员面试秘笈》—— 面试题6 命名Java变量

面试题6 命名Java变量 请命名以下变量. 考点:该面试题主要考察求职者的编程习惯,良好的编程习惯是一个优秀的Java开发者的必备素质.求职者应该掌握基本的Java命名规范,这样编写出来的代码才能做到够规范和易读. 出现频率: [面试题解析]在面向对象编程中,对于类.对象变量.方法等的命名是非常有技巧的,例如,大小写的区分,使用不同字母开头等.但究其本,追其源,在为一个资源命名时,应该本着描述性和唯一性两大特征,才能保证资源之间不冲突,并且便于记忆. 1.包的命名 Java包的名字都是由小写单

《Java程序员面试秘笈》—— 面试题1 简单描述Java开发包的种类

面试题1 简单描述Java开发包的种类 考点:考察求职者对于Java体系的认识,属于Java程序员的必备知识. 出现频率: [面试题解析]随着Java语言的成长和壮大,Java的开发包根据用途的不同已经分为Java EE.Java SE和Java ME 3个开发包,求职者需要列出名称,并具体描述每个开发包的用途. 参考答案: Java SDK的版本分类如下所述. Java ME:(Java Platform Micro Edition)一种以广泛的消费性产品为目的的高度优化的Java运行环境,包

《Java程序员面试秘笈》—— 1.2 线程的创建和运行

1.2 线程的创建和运行 在本章中,我们将学习如何在Java程序中创建和运行线程.在Java语言中,线程跟其他所有元素一样,都是对象(Object).Java提供了两种方式来创建线程: ◆ 继承Thread类,并且覆盖run()方法. ◆ 创建一个实现Runnable接口的类.使用带参数的Thread构造器来创建Thread对象.这个参数就是实现Runnable接口的类的一个对象. 在本章中,我们将使用第二种方法创建一个简单的程序,这个程序将创建并运行10个线程.每个线程用以计算和打印乘以1-1

《Java程序员面试秘笈》—— 面试题4 列出你熟悉的Java开发工具

面试题4 列出你熟悉的Java开发工具 考点:该问题一般会在面试时出现,主要是看求职者是否熟悉常用的Java开发工具,因为一个项目开发团队会使用一种固定的开发工具,只有求职者能够熟练使用该工具,才能够快速融入该团队. 出现频率: [面试题解析]Java作为一种跨平台开发语言,由于其开源性,各个公司和社区组织,都推出了各自的Java开发工具,这也是Java开发体系同微软的开发体系的区别之一.不同的项目开发团队一般都有自己熟悉的开发工具或者开发环境,求职者只有熟练使用不同的开发工具,才能适应项目开发

《Java程序员面试秘笈》—— 导读

前言 Java 7并发编程实战手册 使用计算机时,可以同时做几件事情:可以一边听音乐,一边使用文字处理软件编辑文档,还可以阅读电子邮件.因为操作系统支持并发任务,从而使得这些工作得以同时进行.并发编程是一种平台和机制供多个任务或程序同时运行,并且互相通讯来交换数据(或者与其他任务进行同步等待). Java是一个并发平台,它提供了大量的类来执行Java程序中的并发任务.随着版本的不断更新发展,Java 不断地为程序员增加并发编程的开发功能.本书覆盖了Java 7并发API 中大部分重要而有用的机制

《Java程序员面试秘笈》—— 第1章 Java编程基础

第1章 Java编程基础 通过考察Java编程基础,用人单位可以了解求职者对Java语言的理解程度和熟练程度,一个熟练.具备开发经验的程序员,可以轻松地解答相关问题.而对于刚刚准备步入职场的新人,由于基础不扎实,准备不充分,Java基础编程方面的面试题往往会给他们造成一定的困扰.值得注意的是,企业和学校对Java基础考察的方向有很大的不同,往往求职者对哪些编程基础必须掌握没有一个清醒的认识,不知道企业需要考察哪方面的知识,这样会失去很多可贵的机会. 本章通过真实的试题,从多个角度讲解Java编程

《Java程序员面试秘笈》—— 面试题2 Java语言的特性有哪些

面试题2 Java语言的特性有哪些 考点:考察求职者对Java语言的认识. 出现频率: [面试题解析]需要求职者列出Java语言的几个重要特点.答题时只需要写出特点,一般不需要详细解释.下面参考答案中给出了相应的详细描述,供读者参考,同时加强理解. 参考答案: Java语言是一个面向对象的程序设计语言.Java语言吸收了Smalltalk语言和C++语言的优点,并增加了其他特性,如支持并发程序设计.网络通信和多媒体数据控制等.主要特性如下. (1)Java语言是简单的.一方面,Java语言的语法