我有一个长期运行的任务,如:
public void myCancellableTask() {
while ( someCondition ) {
checkIfCancelRequested();
doSomeWork();
}
}
Run Code Online (Sandbox Code Playgroud)
任务可以取消(请求取消,checkIfCancelRequested()检查取消标志).通常,当我编写这样的可取消循环时,我使用一个标志来指示已请求取消.但是,我知道我也可以使用Thread.interrupt并检查线程是否被中断.我不确定哪种方法是首选,为什么,想法?
谢谢,
杰夫
我的程序经历了这样的循环:
...
while(1){
read(sockfd,buf,sizeof(buf));
...
}
Run Code Online (Sandbox Code Playgroud)
read函数在等待输入时阻塞,这恰好来自套接字.我想处理SIGINT并且基本上告诉它在读取时停止读取函数然后调用任意函数.做这个的最好方式是什么?
对.今天我花了三个多小时试图理解为什么你不能在保护模式下调用bios ISR.我得到的一旦你设置和IDT它不一定是在通常的地址为IVT加段没有固定的大小在保护模式等.但我仍然不明白为什么不能你jsut创建一个4GB段,将您的IDT段映射到BIOS IVT,将所有内容设置为0,然后调用它们.不应该那样吗?
大多数文章要么说:"记住你不能在保护模式下使用BIOS中断!" 没有探索主题或极具描述性和引用陷阱,例外,图片重新制作,缺乏权利和段记录的问题作为其背后的原因.
如果有人能够提出一个更人性化的解释,那将是非常有帮助的...我不怀疑文章所说的内容,我只是想明白为什么会这么"痛苦"!
提前致谢!
我是否需要保护我的中断处理程序被多次调用同一个中断?
鉴于以下代码,我不确定我应该进行的系统调用.我正在使用当前的实现获得罕见的随机死锁: -
void interrupt_handler(void)
{
down_interruptible(&sem); // or use a lock here ?
clear_intr(); // clear interrupt source on H/W
wake_up_interruptible(...);
up(&sem); // unlock?
return IRQ_HANDLED;
}
void set/clear_intr()
{
spin_lock_irq(&lock);
RMW(x); // set/clear a bit by read/modify/write the H/W interrupt routing register
spin_unlock_irq(&lock);
}
void read()
{
set_intr(); // same as clear_intr, but sets a bit
wait_event_interruptible(...);
}
Run Code Online (Sandbox Code Playgroud)
interrupt_handler:down_interruptible是spin_lock_irq/ spin_lock_irqsave/ local_irq_disable?set/clear_intr:spin_lock_irq是spin_lock_irqsave/ local_irq_disable? …有没有办法在不取消它的情况下打断未来?
boolean cancel(boolean mayInterruptIfRunning)
尝试取消执行此任务.如果任务已完成,已取消或由于某些其他原因无法取消,则此尝试将失败.如果成功,并且在调用cancel时此任务尚未启动,则此任务永远不会运行.如果任务已经启动,则mayInterruptIfRunning参数确定执行此任务的线程是否应该在尝试停止任务时被中断.
要捕获中断,我们必须正确捕获Interrupted Exception或检查Runnable/Callable方法中的isInterrupted()方法.
但是没有办法使用Future接口中断正在运行的Future
由于所有线程都在Executor Service池中,因此没有人可以执行thread.interrupt().这就是为什么假设只有当Future被取消或线程池终止时才会出现任何中断?
我试图理解为什么Future接口中没有中断方法.任何帮助将不胜感激
基本上,问题标题是什么.
Thread t = new Thread(someRunnable);
t.start();
t.interrupt();
t.join(); //does an InterruptedException get thrown immediately here?
Run Code Online (Sandbox Code Playgroud)
从我自己的测试来看,似乎,但只是想确定.我猜测在执行"等待"例程之前Thread.join()检查interrupted线程的状态?
java concurrency multithreading interrupt interrupted-exception
这是"英特尔架构软件开发人员手册"中的异常和中断表(我理解为IDT)

定时器中断在哪里使上下文切换成为可能?(用于多任务处理)
如果这是一个愚蠢的问题,请解释我的理解.先感谢您
在Windows上,我的平台是x86和x86-64.
中断优先级系统的要点是让最高优先级的中断超过其他中断.为了强制执行此操作,我猜测Windows将完全禁用所有较低级别的中断,直到更高级别中断的ISR完成为止.
但如果CPU没有收听中断,会发生什么?他们只是默默地消失了吗?或者他们是否在硬件中排队,等待中断再次启用?如果存放,在哪里?有多少人可以排队?如果有太多中断没有被处理,会发生什么?如果存在中断处理积压的罕见情况,检测问题的工具是什么?
我理解InterruptedException的作用以及它被抛出的原因.但是在我的应用程序中,我在等待SwingUtilities.invokeAndWait()一个只有我的应用程序知道的线程时得到它,而我的应用程序从不调用Thread.interrupt()任何线程,它也永远不会将线程的引用传递给任何人.
所以我的问题是:谁打断了我的线程?
有什么方法可以说出来吗?是否有理由说InterruptedException不包含请求中断的Thread的名称?
我读到它可能是一个框架或库来执行此操作,我们使用以下内容,但我无法想到它们中断我的线程的原因:
下面的代码是用于定义中断向量表的u-boot的第一部分,我的问题是如何使用每一行.我理解前两行是起点和第一条实现的指令:reset,我们在下面定义reset.但我们什么时候会在下面使用这些说明?根据System.map,每条指令都有一个固定的地址,所以_fiq在0x0000001C,当我们想要执行fiq时,我们会将这个地址复制到pc然后执行,对吧?但是我们可以通过哪种方式跳转到这条指令:ldr pc,_fiq?它是通过硬件还是软件实现的?希望我能让自己理解正确.
>.globl _start
>_start:b reset
> ldr pc, _undefined_instruction
> ldr pc, _software_interrupt
> ldr pc, _prefetch_abort
> ldr pc, _data_abort
> ldr pc, _not_used
> ldr pc, _irq
> ldr pc, _fiq
>_undefined_instruction: .word undefined_instruction
>_software_interrupt: .word software_interrupt
>_prefetch_abort: .word prefetch_abort
>_data_abort: .word data_abort
>_not_used: .word not_used
>_irq: .word irq
>_fiq: .word fiq
Run Code Online (Sandbox Code Playgroud)