在Java并发编程中,线程中断与等待通知是两个非常重要的概念,它们能够帮助我们更好地控制线程的运行状态,提高程序的性能和响应速度。接下来,我们就来一起学习一下这两个技巧。
线程中断
线程中断是Java中一种用来通知线程停止执行当前任务的方式。当线程被中断时,它会收到一个中断信号,可以通过isInterrupted()或interrupted()方法来检查线程是否被中断。
中断方法
public class InterruptExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
try {
// 模拟耗时任务
Thread.sleep(1000);
} catch (InterruptedException e) {
// 处理线程中断
System.out.println("Thread interrupted!");
}
});
thread.start();
thread.interrupt(); // 中断线程
}
}
在上面的代码中,我们创建了一个线程,并让它执行一个耗时的任务。然后,我们通过调用interrupt()方法来中断线程。如果线程在执行sleep()方法时被中断,它会抛出InterruptedException,我们可以捕获这个异常并处理线程中断。
注意事项
- 中断只是一个建议,线程是否立即停止执行取决于线程的状态和当前执行的代码。
- 使用中断时,务必检查中断状态,避免在处理中断时再次抛出异常。
等待通知
等待通知是Java中一种线程同步机制,允许一个线程在某个条件下等待,直到另一个线程通知它继续执行。
等待方法
public class WaitNotifyExample {
private static final Object lock = new Object();
private static boolean flag = false;
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
synchronized (lock) {
try {
while (!flag) {
lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1 is notified!");
}
});
Thread t2 = new Thread(() -> {
synchronized (lock) {
flag = true;
lock.notify();
}
System.out.println("Thread 2 has notified Thread 1!");
});
t1.start();
t2.start();
}
}
在上面的代码中,我们创建了两个线程t1和t2。线程t1在while循环中等待条件flag变为true。当线程t2执行notify()方法时,线程t1会被唤醒并继续执行。
注意事项
- 使用
wait()、notify()和notifyAll()方法时,必须处于同步代码块或同步方法中。 notify()方法只会唤醒一个等待的线程,而notifyAll()方法会唤醒所有等待的线程。- 在
wait()方法后,务必释放锁,否则其他线程无法进入同步代码块或同步方法。
总结
通过学习线程中断和等待通知这两个技巧,我们可以更好地控制线程的运行状态,提高程序的性能和响应速度。在实际开发中,合理运用这两个技巧,可以让我们的并发程序更加健壮和高效。
