关于read 被中断

linux下read被信号中断后,中断处理返回后,read可能的操作有两种情况:

1,read停止读取行为,返回读取数,继续下一条指令的执行。

2,read被重启,即继续执行read操作。


linux有个变量用来对这两种行为操作的选择。即SA_RESTART参数。


参考文献:http://bbs.chinaunix.net/thread-928746-1-1.html

<think>好的,用户问的是“线程阻塞被中断会怎样”,我之前介绍了Semaphore,现在这个问题涉及线程中断机制,需要详细解释。 首先,我得回忆Java中线程中断的相关知识。线程中断是一种协作机制,当线程被中断时,它会收到一个中断信号,但具体如何处理取决于线程当前的状态和代码逻辑。特别是当线程处于阻塞状态时,比如在wait、sleep、join或者I/O操作时,中断会触发InterruptedException,这一点很重要。 用户可能想知道在这种情况下,线程会发生什么变化。比如,当一个线程在调用semaphore.acquire()时被阻塞,此时如果另一个线程调用了它的interrupt()方法,会发生什么?这时候需要说明InterruptedException会被抛出,并且中断状态会被清除,所以需要正确处理异常,可能重新设置中断状态。 另外,要注意区分不同的阻塞情况。比如,如果线程是因为synchronized锁或者ReentrantLock的lock()方法而阻塞,这些情况下中断不会立即生效,线程会一直等待锁,直到获取到锁之后才检查中断状态。而像Lock的lockInterruptibly()方法则允许在等待锁时响应中断。 用户可能的实际应用场景中,比如在使用线程池处理任务时,如何优雅地停止任务,这时候正确的中断处理就很重要。需要提醒用户注意捕获异常后的资源释放,避免死锁或者资源泄漏。 还需要考虑用户可能的误区,比如认为调用interrupt()会立即停止线程,但实际上只是设置标志位,具体行为由线程自己决定。因此,在阻塞方法中抛出异常,但非阻塞情况下需要手动检查isInterrupted()。 最后,给出示例代码,说明正确的处理方式,比如在catch块中恢复中断状态,或者在处理完异常后合理结束线程。这样用户能更直观地理解如何在实际编码中应用这些知识。</think>--- **当线程在阻塞状态被中断时,会触发 `InterruptedException` 异常,并清除线程的中断状态**。以下是详细说明: --- ### **1. 线程阻塞的常见场景** 线程可能因以下操作进入阻塞状态: - 调用 `Object.wait()` - 调用 `Thread.sleep()` - 调用 `LockSupport.park()` - I/O 操作(如 `Socket.read()`) - 同步等待(如 `Semaphore.acquire()`、`CountDownLatch.await()`) --- ### **2. 中断阻塞线程的行为** - **抛出 `InterruptedException`**: 若线程在阻塞时被其他线程调用 `interrupt()`,**阻塞方法会立即抛出 `InterruptedException`**,线程退出阻塞状态。 ```java try { Thread.sleep(1000); // 阻塞状态 } catch (InterruptedException e) { // 中断后执行此处代码 } ``` - **清除中断状态**: 抛出 `InterruptedException` 后,**线程的中断状态会被自动清除**(即 `isInterrupted()` 返回 `false`)。 - 若需保留中断状态,需在 `catch` 块中手动调用 `Thread.currentThread().interrupt()`。 --- ### **3. 关键注意事项** #### **(1) 正确处理中断** - **强制终止 vs 协作式终止**: 中断机制是协作式的,**需线程主动检查中断状态或处理 `InterruptedException`**。直接忽略中断可能导致逻辑错误。 - **资源释放**: 在 `catch` 块中必须释放已占用的资源(如关闭文件、释放锁),避免死锁或资源泄漏。 #### **(2) 不可中断的阻塞** - **某些阻塞操作不响应中断**: - `synchronized` 锁竞争:线程等待 `synchronized` 锁时,中断不会使其退出阻塞。 - `ReentrantLock.lock()`:与 `synchronized` 类似,需改用 `lockInterruptibly()` 支持中断。 - 部分 I/O 操作(如 `Socket.write()`):需通过关闭底层资源强制终止阻塞。 --- ### **4. 代码示例** ```java Thread thread = new Thread(() -> { try { // 阻塞操作(可响应中断) Semaphore semaphore = new Semaphore(0); semaphore.acquire(); // 此处阻塞 } catch (InterruptedException e) { // 中断后执行此处 System.out.println("线程被中断,退出阻塞"); Thread.currentThread().interrupt(); // 重新设置中断状态 } }); thread.start(); Thread.sleep(1000); thread.interrupt(); // 中断阻塞线程 ``` --- ### **5. 最佳实践** 1. **避免屏蔽中断**: - 不要忽略 `InterruptedException`,需根据业务决定是恢复中断、终止线程还是记录日志。 2. **恢复中断状态**: - 若不能立即处理中断,应在 `catch` 块中调用 `Thread.currentThread().interrupt()` 保留中断信号。 3. **区分中断与取消**: - 使用 `Future.cancel(true)` 结合中断机制实现任务取消。 --- ### **总结** 线程阻塞被中断时,**通过抛出 `InterruptedException` 强制退出阻塞状态**,但开发者需合理处理异常,确保资源安全和逻辑正确性。理解这一机制是编写健壮并发程序的关键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值