阻塞多线程的情况有很多种
有可以中断的sleep()方式。
有不可以中断的IO和同步方式。
java.util.concurrent 提供 ExecutorService.submit()来执行单个线程 返回一个可执行的上下文Future<?>通过Future 可以对阻塞进行中断 Future.cancle(true);
package com.text;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
//sleep 可中断的阻塞线程
class SleepBlocked implements Runnable {
public void run() {
try {
TimeUnit.SECONDS.sleep(100);
} catch (InterruptedException e) {
System.out.println("InterruptedException");
}
System.out.println("Exiting SleepBlocked.run()");
}
}
// IO 阻塞线程
class InputBlocked implements Runnable {
private InputStream in;
public InputBlocked(InputStream is) {
this.in = is;
}
public void run() {
try {
System.out.println("Waiting for read()");
in.read();
} catch (IOException e) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("Interrupted from blocked I/O");
} else {
throw new RuntimeException(e);
}
}
System.out.println("Exiting InputBlocked.run");
}
}
//同步阻塞线程
class SynchronizedBlocked implements Runnable {
private synchronized void f() {
while (true) {
Thread.yield();
}
}
public SynchronizedBlocked() {
new Thread() {
public void run() {
f();
}
}.start();
}
public void run() {
System.out.println("Trying call the f()");
f();
System.out.println("Exiting SynchronizedBlocked.run()");
}
}
public class Interrupting {
private static ExecutorService exec = Executors.newCachedThreadPool();
static void test(Runnable r) throws InterruptedException {
Future<?> t = exec.submit(r);
TimeUnit.SECONDS.sleep(100);
System.out.println("Interrupting " + r.getClass().getName());
t.cancel(true);
System.out.println("Interrupt sent to " + r.getClass().getName());
}
public static void main(String[] args) throws InterruptedException {
test(new SleepBlocked());
test(new InputBlocked(System.in));
test(new SynchronizedBlocked());
TimeUnit.SECONDS.sleep(3);
System.out.println("Aborting with System.exit(0)");
System.exit(0);
}
}
下面是打印出来的结果:
Interrupting com.text.SleepBlocked
Interrupt sent to com.text.SleepBlocked
Exiting SleepBlocked.run()
Waiting for read()
Interrupting com.text.InputBlocked
Interrupt sent to com.text.InputBlocked
Trying call the f()
Interrupting com.text.SynchronizedBlocked
Interrupt sent to com.text.SynchronizedBlocked
Aborting with System.exit(0)
可见IO和同步方式的阻塞 是不能被中断的。
分享到:
相关推荐
在线程A调用wait()后,A会被阻塞并释放锁,等待其他线程调用notify()或notifyAll()唤醒。使用这些方法时,必须在同步块或同步方法中,否则会抛出IllegalMonitorStateException。 - 生产者-消费者模型:这是一个经典...
线程的中断(interrupt())和检查中断状态(isInterrupted()、interrupted())是处理异常情况的关键。同时,当一个线程抛出未捕获异常时,会终止该线程并通知其父线程。 在《java线程与并发实践编程》中,作者Jeff ...
综上所述,唤醒阻塞或休眠的线程通常涉及线程同步、中断机制以及并发工具的使用。通过这些方法,我们可以确保线程安全、高效地执行,避免数据不一致和系统资源的浪费。在处理线程时,应当优先考虑协作而非强制终止,...
- **线程生命周期**:Java线程有新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)五种状态。 - **线程调度**:Java使用抢占式调度,优先级高的线程优先执行,但也存在公平与...
Java提供了多种方法来控制线程状态,如`start()`启动线程,`sleep()`使线程暂停,`join()`等待线程完成,以及`interrupt()`中断线程。 并发控制是线程编程中的重要部分。Java提供了synchronized关键字来实现互斥...
6. **阻塞队列(BlockingQueue)**:在多线程处理中,可能会使用阻塞队列,如`LinkedBlockingQueue`,它允许生产者线程添加任务,而消费者线程在队列为空时会被阻塞,直到有新的任务到来。这样可以确保任务被及时...
如果其他线程试图进入同一同步代码块,它们会被阻塞,直到当前线程完成代码执行并释放锁。 `synchronized`关键字提供了两种形式:同步方法和同步代码块。同步方法通过在方法声明前加上`synchronized`关键字,使得...
- **中断与守护线程**:`Thread.interrupt()`方法用于中断线程,`isInterrupted()`和`interrupted()`检查中断状态。守护线程(Daemon Thread)是一种在所有非守护线程结束时自动结束的线程,常用于后台服务。 在...
例如,在上述的Linux课程设计中,提到的并发写入字符设备的情况,当多个线程并发地读写设备,可能会导致读取到的数据不准确,这就是竞态条件的一个实例。 Linux提供了多种并发控制机制来解决这些问题: 1. **中断...
阐述`interrupt`、`interrupted`和`isInterrupted`方法之间的区别,以及如何处理线程中断的情况。 - **第14章:守护线程** 解释什么是守护线程,以及在哪些情况下应该使用守护线程。 - **第15章:线程池的使用** ...
5. **Monitor.TryEnter()**:尝试获取锁,若无法获取则不会阻塞线程。 线程通信: 1. **线程间信号量(ManualResetEvent, AutoResetEvent)**:用于线程间的同步,等待或通知其他线程。 2. **CountdownEvent**:...
在C#编程中,多线程是一个至关重要的概念,尤其在现代高性能应用...总结,C#的多线程特性为我们提供了强大的并发能力,通过实例源代码学习,可以深入理解这些概念,并在实际项目中灵活运用,提升程序性能和用户体验。
9. **线程中断与异常处理**:正确处理线程的中断请求和异常是保证程序健壮性的必要条件。学会使用Thread.interrupt()和检查InterruptedException是编写健壮多线程程序的重要技巧。 10. **线程局部变量ThreadLocal**...
Java并发编程中的线程基础是理解多线程编程的关键,它涵盖了从线程的创建到管理,再到线程间通信的全过程。多线程编程在处理高性能和高响应性的应用程序时至关重要,因为它允许程序在单个进程中同时执行多个任务,...
在这个并发例子中,我们关注的是如何在SWT应用中正确处理耗时的后台任务,以避免阻塞用户界面(UI)线程,即事件调度线程。 首先,了解Java中的线程模型至关重要。Java应用程序通常由主线程运行,这个主线程负责...
Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。即“线程中断”并不是字面意思——线程真的中断了,而是设置了中断标志...
总的来说,这个简单的示例展示了如何在Java中使用线程中断来控制并发任务的执行流程,特别是在处理长时间阻塞操作时,中断机制提供了一种优雅的退出方式,确保程序的响应性和可控制性。在实际开发中,理解并正确使用...
通过实际操作这些代码,你将更好地理解和掌握Java多线程与同步的概念,提升你的并发编程能力。记得在实践过程中,结合理论知识去理解代码逻辑,这样能帮助你在实际工作中更自如地处理多线程问题。