当前位置: 首页 > 知识库问答 >
问题:

Java线程中断只需等待、加入和Hibernate

张鹏鹍
2023-03-14

如果该线程在选择器中被阻塞,那么该线程的中断状态将被设置,并且它将立即从选择操作中返回,可能使用一个非零值,就像调用了选择器的wakeup方法一样。

如果前面的条件都不成立,那么该线程的中断状态将被设置。

中断不活动的线程不需要有任何影响。

AtomicBoolean thread1Done = new AtomicBoolean(false);

//write in file
Thread thread1 = new Thread(() -> {

    try(var writer = Files.newBufferedWriter(Paths.get("foo.txt"))){

        for(int i = 0; i < 10000; i++){
            writer.write(i);
            writer.newLine();
        }

    }catch(Exception e){ e.printStackTrace(); }

    thread1Done.set(true);

});

//interrupt thread1
Thread thread2 = new Thread(() -> {

    while(!thread1Done.get()){
        thread1.interrupt();
    }

});

thread2.start();
thread1.start();

我在Windows10 x64上用JDK10运行我的代码

共有1个答案

寇开畅
2023-03-14

如果您希望只在线程被wait、join和sleep调用阻塞而不是IO操作阻塞时中断线程,则只需在调用interrupt方法之前检查线程状态即可。您可以在下面的链接中引用api和不同的状态。

https://docs.oracle.com/javase/10/docs/api/java/lang/thread.state.html

示例代码可能如下所示。

while ( ( thread1.getState() == Thread.State.WAITING || thread1.getState() == Thread.State.TIMED_WAITING ) && !thread1Done.get()) {
    thread1.interrupt();
}
 类似资料:
  • 问题内容: 我有以下情况: 为了运行算法,我必须运行多个线程,并且每个线程都会在死之前设置一个实例变量x。问题是这些线程不会立即返回: 我应该使用等待通知吗?还是我应该嵌入一个while循环并检查是否终止? 感谢大家! 问题答案: 创建一些共享存储来保存每个线程的值,或者如果足够的话,只存储总和。使用a 等待线程终止。每个线程完成后都会调用,您的方法将使用该方法来等待它们。 编辑: 这是我建议的方

  • 嗨,我正在做一个项目,我已经达到了我非常困的部分。我试图寻找方法来学习如何在繁忙的等待中编写 while 循环,但我没有找到任何东西,我的代码只是作为无限循环运行。有人可以帮助我解释一个繁忙的等待循环应该如何工作,并帮助我打破这个无限循环吗? 该项目希望做到以下几点:早上,学生醒来后(这需要一段随机的时间),他会去洗手间为新的上学日做准备。如果浴室已经客满,学生需要Rest一下(使用yield()

  • 我对Java线程和并发有点陌生。我读过关于同步和锁定块的书。它们让其他线程等待第一个线程完成其工作。 我只想知道一种方式,如果线程a正在执行它的执行,那么线程B不应该等待并跳过共享代码块的执行。

  • 问题内容: 我正在为我的ubuntu服务器(针对我的多客户端匿名聊天程序)实现一种简单的线程池机制,并且需要使我的工作线程进入睡眠状态,直到需要执行一项工作(以函数指针和参数的形式) 。 我当前的系统即将关闭。我(工人线程正在)问经理是否有工作可用,以及是否有5毫秒没有睡眠。如果存在,请将作业添加到工作队列中并运行该函数。糟糕的循环浪费。 什么我 喜欢 做的是做一个简单的事件性的系统。我正在考虑有

  • 我想更多地了解线程睡眠解析是如何工作的,以及它与睡眠()解析之外的内容有什么联系。 我知道它是由操作系统定义的,而在Windows上通常是15ms。我最近环顾四周无法确认这一点,但我依稀记得这个15ms是由操作系统循环的,并且对所有线程都是“全局的”,这意味着15ms不是线程可以Hibernate的最短时间,而是最大Hibernate时间(1)。对吗?所有操作系统都一样吗(超过持续时间)? 我想不

  • 问题内容: 问题描述 : - 步骤1: 在主线程中从用户那里获取输入FILE_NAME。 步骤2: 对该文件执行10个操作(即,计数字符,计数行等。),所有这10个操作必须位于单独的线程中。这意味着必须有10个子线程。 步骤3: 主线程等待,直到所有那些子线程完成。 步骤4: 打印结果。 我做了什么 :- 我用3个线程做了一个示例代码。 我不希望您遇到文件操作代码。 问题:- 我上面的代码没有给出