关于线程的停止

2024-04-28

我开发了一个代码,它将在执行时启动两个线程

public class MyThread1 extends Thread //extend thread class 
{
    // public  synchronized void run()
     //synchronized (this)

     public   void run()
    {//synchronized(this)
        //{
         for(int i=0;i<20;++i) {
             try{
                 Thread.sleep(500);


          System.out.print(i +"\n"+ "..");
             }catch(Exception e)
             {e.printStackTrace();}
          //} 
        }

     }  

 public static void main(String... a) 
 {
     MyThread1 t = new MyThread1();

     Thread x = new Thread(t);

     Thread y = new Thread(t);
     x.start();
     y.start();

     }

现在它启动两个线程,但如果我想停止一个特定的线程怎么办,假设我想停止线程 Y 那么我将如何做,请告知,因为停止线程意味着它的 run 方法已完成,但我想停止它强行我将如何做到这一点,请告知


免责声明:这个答案具有教程性质。

基本方法:我们最初让事情变得简单,并且不处理期间的中断Thread.sleep方法。本质上,您应该有一个外部可设置的变量,run 方法在循环的每次迭代时都会检查该变量;然后你可以设置该变量来优雅地终止run()方法。请注意这个习惯用法如何可以轻松地用于 Java 以外的语言。

例如:

public class MyThreadedClass extends Thread {

  private volatile boolean completed = false;

  public void setCompleted() {
    this.completed = true;
  }

  public void run()
  {
    while (!completed) {
      // do anything you fashion
    }
  } 

  public static void main(String... args) 
  {
    MyThreadedClass x = new MyThreadedClass();
    MyThreadedClass y = new MyThreadedClass();

    x.start();
    y.start();

    x.setCompleted(); // will complete as soon as the latest iteration finishes

    ...
  }
}

COMMENTS:易失性标志告诉编译器completed可能(并且将会)在控制范围之外进行更改run()函数,即另一个线程可能会改变它。否则,循环中的迭代检查可能会根据类的唯一同步行为被错误地优化。

在你的具体run()情况下,我们利用for循环,所以我们的方法转化为以下内容:

public void run()
{
  try {
    for(int i=0;i<20 && !completed;++i) {        
      Thread.sleep(500);
      System.out.print(i +"\n"+ "..");
    } 
  } catch(Exception e) {
    e.printStackTrace();
  }
}

COMMENTS:很明显,由于 sleep 调用,您可能需要等待 500 毫秒。但是,如果您的代码通常必须执行改变变量状态的操作(特别是,如果这些变量在多个线程之间共享!),那么您就不会让这些变量处于不正确的状态。在实践中,你可以正确处理交易因为您可以控制终止。这显然假设在循环的每次迭代结束时,变量状态是一致的。

现在让我们改进处理期间中断的基本方法Thread.sleep.

完整答案:这个答案涉及到,从调用方来说,使用Thread.interrupt()方法,这使得该方法严格特定于 Java。

public class MyThreadedClass extends Thread {

  public void run()
  {
    try {
      for(int i=0;i<20 && !this.isInterrupted();++i) {        
        Thread.sleep(500);
        System.out.print(i +"\n"+ "..");
        ...
        // some molassy slow code here, where you may sprinkle isInterrupted()
        // checks and consequent break statements 
      } 
    } catch(InterruptedException e) {
      // do whatever you need to clean things up
    } catch(Exception e) {
      // handle other exceptions as seen fit
    }
  }

  public static void main(String... args) 
  {
    MyThreadedClass x = new MyThreadedClass();

    x.start();

    // will complete 
    // a) as soon as one isInterrupted() check breaks the loop, or 
    // b) "immediately" during the blocking call to sleep()
    x.interrupt(); 

    ...
  }
}

COMMENTS:在这种情况下,线程本身已经完成了一半的工作。如果您只需要在执行期间中断Thread.sleep调用,那么你除了处理之外不需要做任何事情InterruptedException如有必要,清理您的状态。相反,如果您需要在“慢速”代码期间中断,则必须调用this.isInterrupted()无论您喜欢什么地方(可能在多个地方)并打破循环;循环条件内的调用很常见,但不是必需的。

更多信息可以在 Java 并发中找到中断教程 http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于线程的停止 的相关文章

  • 如何在 Spring 5 MVC 中将 FilePart 转换为 byte[]

    我有从网络表单接收和上传文件的控制器方法 如何从 FilePart 中提取字节数组并将其保存到数据库 我可以通过使用 FilePart transferTo 将 FilePart 保存到文件中来完成此操作 但这看起来又慢又难看 有更好的方法
  • 在tomcat中显示Spring-security的SQL错误

    我使用 spring security 框架创建了一个 Web 应用程序 我设置了一个数据库来存储用户及其角色 但 tomcat 给出以下错误 17 sep 2010 11 56 14 org springframework beans f
  • “在 arraylist 构造函数中找不到 add(java.lang.String) 合适的方法”?

    import java util ArrayList import java util Random public class College instance variables replace the example below wit
  • 如何操作指定列上的 JTable 返回值?

    我有一个 JTable 有两列 可编辑的JTable 当用户在第二列中输入内容时 我的要求如下 用户只能输入数字和逗号 当用户输入错误字符时 会发出蜂鸣声 Toolkit getDefaultToolkit beep 我该如何实现这一目标
  • 如何找出已使用的 JAR?

    在更大的项目中 我们可能会使用大量的 JAR 如何找出项目 而不是整个项目 中的某个模块 包正在使用哪些 JAR 有什么工具 技术等吗 较大的项目通常使用类似的构建工具maven http maven apache org or ant h
  • 我如何通过代码在 Anylogic 中创建路径空间标记元素

    我在anyloigic方面完全是菜鸟 现在我正在尝试通过代码创建简单的网络 具有两个点节点的网络 以及链接这些节点的路径 遇到一些问题 当我运行模型时 控制台显示 使用初始化 方法 但我已经知道 初始化方法在较低版本中已被弃用 我使用的是8
  • 当目标是属性时,@Throws 不起作用

    在看的同时这个问题 https stackoverflow com q 47737288 7366707 我注意到申请 Throws to a get or setuse site 没有影响 此外 唯一有效的目标 for Throws ar
  • 关于java中同步的问题;何时/如何/到什么程度

    我正在开发我的第一个多线程程序 并在同步的几个方面陷入困境 我已经浏览了 oracle sun 主页上的多线程教程 以及这里的一些关于 SO 的问题 所以我相信我知道什么是同步 然而 正如我提到的 有几个方面我不太确定如何弄清楚 我以明确问
  • 清理 IntelliJ 中构建的 Play 框架

    我有一个拼写错误conf routes文件导致 Play Framework 生成错误命名的类 重建项目并运行Invalidate Caches并没有解决 IntelliJ 中的问题 当我手动运行时重新生成了不正确的类文件play clea
  • 将 Spring ModelAttribute 应用于所有使用特定参数类型的控制器

    在 Spring Boot REST 应用程序中 我有一个TableRequest包含表格数据 GET 请求的列排序 筛选和分页详细信息的类型 它是通用的 因为它不关心所请求的具体数据是什么 它只指定通用表参数 因此它适用于许多不同的控制器
  • 在 JUnit 测试中读取资源文件

    我在单元测试中读取文本文件 并将一些输入文本文件放置在资源文件夹中 以下是目录结构 src gt com gt au gt myapp gt util gt MyFileReader 测试 gt com gt au gt myapp gt
  • 测试 Hessian remoting-servlet.xml

    我们使用 Hessian 来实现富客户端和服务器之间的通信 由于移动和重命名 remoting servlet xml 中的条目有时会与实际的类名不匹配 因此 我正在寻找一种简单的方法来测试远程处理 xml 有没有简单的方法可以做到这一点
  • 使用 https 的 Java Jersey RESTful Web 服务

    我是 Java EE 的新手 正在开发一个 RESTful API 其中每个 API 调用用户都会发送编码的凭据 我的问题是如何通过默认的 http 实现 https 协议并确保我的连接安全 我正在使用 Jersey Restful Web
  • Java并发锁和条件的使用

    我可以用object wait object notify and synchronized blocks解决生产者消费者类型的问题 同时我可以使用locks and conditions from java util concurrent
  • 如何将模型从 ML Pipeline 保存到 S3 或 HDFS?

    我正在尝试保存 ML Pipeline 生成的数千个模型 正如答案中所示here https stackoverflow com questions 32121046 run 3000 random forest models by gro
  • SWIG C 函数指针和 JAVA

    我有一些 C 代码 其中一个方法有一个函数指针作为参数 我正在尝试在我的 Android 应用程序中使用 C 代码 我决定使用 SWIG 来完成生成我需要的 java 文件的所有工作 一切都适用于常规函数 没有函数指针作为参数的函数 但我不
  • 如何通过sparkSession向worker提交多个jar?

    我使用的是火花2 2 0 下面是我在 Spark 上使用的 java 代码片段 SparkSession spark SparkSession builder appName MySQL Connection master spark ip
  • JAXB 枚举字段未序列化

    我有以下课程 package dictionary import java io Serializable import java util Objects import javax xml bind annotation XmlEleme
  • 如何在 Android 上设置 Google Drive API?

    我一直在尝试将 Google Drive 功能集成到我的应用程序中 但我无法使用任何内置功能 因此我相信我要么错过了一个步骤 要么做得不正确 我正在遵循官方的 Google 开发者指南 https developers google com
  • JAAS keytab 配置的相对路径

    我有一个系统 其中 NET 客户端使用 Kerberos 针对 Java 服务器进行身份验证 一切正常 但我正在尝试改进服务器配置 目前一个keytab根目录中需要文件C 因为我的jaas配置文件看起来像这样 Server com sun

随机推荐

  • 在运行时在 iOS 上添加框架

    首先 我将描述我的用例 说明为什么我需要在 iOS 上运行时添加框架 假设我在 iOS 设备上有一个应用程序 该应用程序需要一些第三方框架来添加一些外部功能 现在 功能有很多 所以 所需的框架数量也会很多 用户可能不需要很多功能 只是一小部
  • 重新格式化 csv 文件

    我有这个 csv 文件 其中只有两个条目 这里是 Meat One Abattoirs Exporters Food Delivery Butchers Retail Meat Dealers Retail Meat Freezer Mea
  • R语言赋值

    我想知道 R 语言中的赋值是如何工作的 考虑以下 R shell 会话 gt x lt c 5 6 7 gt x 1 lt 10 gt x 1 10 6 7 gt 我完全理解 创建向量 5 6 7 并将其绑定到 符号 x 之后 x 会反弹到
  • Objective-C 类别导致无法识别的选择器

    我的项目有一个UIImage我想从另一个类调用的类别函数 我正确导入了图像类别的头文件 并且在没有警告的情况下编译了项目 问题是当我打电话时UIImage类别函数我看到一个无法识别的选择器错误NSInvalidArgumentExcepti
  • 缺少 /var/lib/mysql/mysql.sock 文件

    我正在尝试访问 mysql 当我运行 mysql 命令时 我得到以下信息 root ip 10 229 65 166 tpdatabase 1 8 0 28356 mysql 错误 2002 HY000 无法连接到 通过socket本地My
  • 如何在 NavHostFragment 中检索当前片段?

    我试图在新的导航组件中找到一种方法 但我没有找到任何相关内容 我当前的目的地是 mainHostFragment findNavController currentDestination 但我无法获得对显示片段的任何引用 参考显示的片段 A
  • 仅使用 fprintf 和 fscanf 替换文本文件中的字符串

    抱歉问这么简单的问题 这是我作业的一部分 我被困住了 如你看到的 include
  • Spring中需要多个相同类型的bean

    将其标记为重复之前的请求 我浏览了论坛 但在任何地方都找不到该问题的解决方案 我正在使用 Spring 3 2 编写代码 一切都是纯粹基于注释的 该代码接收从不同 XSD 文件派生的 XML 文件 所以我们可以说 有五个不同的 XSD A1
  • 在 Python 中使用 argparse 处理无效参数

    我在用argparse https docs python org 2 library argparse html解析命令行参数 默认情况下 在收到无效参数时 它会打印帮助消息并退出 是否可以自定义 argparse 在收到无效参数时的行为
  • Nonetype 错误/使用 python 的 beautifulsoup 没有打印任何元素

    所以我尝试使用 python 比较 2 个列表 其中一个包含我从网站获取的 1000 个链接 另一个包含一些单词 这些单词可能包含在第一个列表的链接中 如果是这种情况 我想得到一个输出 我打印了第一个列表 它确实有效 例如 如果链接是 ht
  • Powershell CMD.exe 和路径中的空格

    我在使用执行命令时遇到问题cmd exe在 PowerShell 中 问题是命令的路径中有空格 似乎是 PowerShell 的普遍问题 以下是摘录 base dir resolve path this path has spaces in
  • 有没有办法查看 Docker for Windows 上的容器磁盘使用情况?

    我很好奇除了作为容器映像一部分的层之外 是否还有一种方法可以查看正在运行的 Windows 容器使用了多少磁盘空间 基本上 容器自创建以来 增长 了多少 在 Linux 或在 HyperV 中运行的 Linux 容器 中 这将是docker
  • 熊猫在移动的数据帧上滚动

    这是一段代码 我不明白为什么在最后一列 rm 5 上 前 4 项得到 NaN 我知道对于 rm 列 前 4 项未填充 因为没有可用数据 但如果我移动列计算 应该进行 不是吗 同样 我不明白为什么 rm 5 列中有 5 个而不是 4 个项目是
  • AWS 上的多租户应用程序 - 多个 SSL 证书安装策略

    我正在为 Rails 多租户应用程序做一些规划 并且想知道处理自定义域证书的最佳方法是什么 应用程序是相当沼泽标准 ELB 应用程序服务器和多租户数据库 在我当前的用例中 每个租户都有一个自己独有的应用程序子域 这通常是通过通配符证书来处理
  • 使用 UIWebView loadRequest 的常规块 56、1024、8、244、24 内存泄漏

    我遇到了内存泄漏 但无法通过泄漏 构建 分析或整体检查来找出如何修复 我有一个非常强烈的想法 这是由于我的 UIWebview 加载 JavaScript 的 loadRequest 命令造成的 但我不知道出了什么问题 这是我的设置 我有一
  • Android WebView - 带有经过身份验证的代理

    我目前正在尝试调试围绕 WebView 构建的 Android 应用程序 我负责处理的开发网络环境 不是我的选择 这是 企业 安全决策 是WPA WiFi 代理服务器 代理身份验证 虽然a上的说明以前的答案非常有帮助 https stack
  • 在通用 C# 类中链接隐式运算符

    对于以下通用 C 类 我想将 T 转换为 K public abstract class ValueType
  • 哪种 jQuery 选择方法更快?

    我想知道使用 jQuery 进行选择时使用上下文参数与使用普通 CSS 范围选择器相比是否有任何优势 假设我有这个 html div class contacts h1 All contacts h1 div class contact n
  • 如何在流体宽度容器中将左侧、中间和右侧的三个按钮放置在同一行?

    我在用着LESS在 Twitter Bootstrap 环境中 但我会直接接受CSS也有答案 Fluid width container Btn1 Btn2 Btn3 另一种宽度 Fluid width container Btn1
  • 关于线程的停止

    我开发了一个代码 它将在执行时启动两个线程 public class MyThread1 extends Thread extend thread class public synchronized void run synchronize