46、Java 中 interrupted 和 isInterrupted 方法有什么区别?
interrupted 方法是用来检查当前线程是否被中断的,而 isInterrupted 方法则是用来返回一个 boolean 值,表示当前线程是否被中断。
interrupted 方法只能在主线程中使用,因为它需要访问到 Thread 对象的内部状态来判断线程是否被中断。而 isInterrupted 方法则可以在任何线程中使用,只需要获取当前线程的 Thread 对象即可。
如果当前线程被中断了,调用 interrupted 方法会抛出 InterruptedException 异常,而调用 isInterrupted 方法则不会抛出异常。
代码语言:javascript复制public class Main {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
while (true) {
if (Thread.interrupted()) {
System.out.println("Thread interrupted");
} else {
System.out.println("Thread is running");
}
}
});
thread.start();
// 等待一段时间后中断线程
Thread.sleep(1000);
thread.interrupt();
}
}
我们创建了一个无限循环的线程,并在循环中使用 interrupted 方法来检查线程是否被中断。然后我们在主线程中等待一段时间后中断线程,最后再调用 isInterrupted 方法来检查线程是否被中断。
47、为什么 wait和notify 方法要在同步块中调用?
wait 和 notify 方法必须在同步块中调用,因为它们需要访问到对象的监视器锁(monitor lock),而在同步块中可以保证只有一个线程能够获得该锁。如果 wait 或 notify 方法不在同步块中调用,那么就可能会出现多个线程同时访问到同一个对象的监视器锁的情况,从而导致竞态条件(race condition)的发生。
代码语言:javascript复制public class Main {
private Object lock = new Object();
public synchronized void method() {
synchronized (lock) {
// 在同步块中调用 wait 和 notify 方法
lock.wait();
lock.notifyAll();
}
}
}
我们创建了一个名为 lock 的对象,并将其作为锁来使用。在 method 方法中,我们首先使用 synchronized 关键字将方法标记为同步方法,然后在同步块中调用 wait 和 notify 方法。由于 wait 和 notify 方法需要访问到 lock 对象的监视器锁,因此只有在同步块中才能保证只有一个线程能够获得该锁,从而避免了竞态条件的发生
48、为什么你应该在循环中检查等待条件?
什么是循环中检查等待条件?
在循环中检查等待条件是指,在循环执行过程中,不断检查某个条件是否满足,如果不满足就退出循环。这种方式通常用于多线程编程中,当一个线程需要等待另一个线程完成某些操作后才能继续执行时,可以使用循环来检查等待条件。
为什么应该在循环中检查等待条件?
在循环中检查等待条件可以避免死锁和资源浪费等问题。如果不检查等待条件,可能会出现以下情况:
- 死锁:两个或多个线程相互等待对方释放锁,导致整个系统无法正常运行。
- 资源浪费:如果一个线程一直处于等待状态,而其他线程无法访问该资源,那么这些线程就会被阻塞,造成资源浪费。
因此,在循环中检查等待条件可以避免这些问题的发生,保证程序的正确性和效率
代码语言:javascript复制 java复制代码public class Main {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
while (true) {
if (Thread.interrupted()) {
System.out.println("Thread interrupted");
break;
} else {
// do something
int i = 0;
for (int j = 1; j <= 10; j ) {
System.out.print(i " ");
i ;
}
System.out.println();
Thread.sleep(100);
}
}
});
thread.start();
// 等待一段时间后中断线程
Thread.sleep(1000);
thread.interrupt();
}
}
我们创建了一个无限循环的线程,并在循环中使用 if 语句来检查等待条件。如果线程被中断,则退出循环,否则执行一些操作,然后等待一段时间再继续执行。最后,我们在主线程中调用 interrupt() 方法来中断线程。
49、Java 中的同步集合与并发集合有什么区别?
50、什么是线程池? 为什么要使用它?
51、怎么检测一个线程是否拥有锁?
52、你如何在 Java 中获取线程堆栈?
53、JVM 中哪个参数是用来控制线程的栈堆栈小的?
54、Thread 类中的 yield 方法有什么作用?
55、Java 中 ConcurrentHashMap 的并发度是什么?
56、Java 中 Semaphore 是什么?
57、Java 线程池中 submit() 和 execute()方法有什么区别?
58、什么是阻塞式方法?
59、Java 中的 ReadWriteLock 是什么?
60、volatile 变量和 atomic 变量有什么不同?
61、可以直接调用 Thread 类的 run ()方法么?
62、如何让正在运行的线程暂停一段时间?
63、你对线程优先级的理解是什么?
64、什么是线程调度器(Thread Scheduler)和时间分 片 (Time Slicing )?
65、你如何确保 main()方法所在的线程是 Java 程
66、线程之间是如何通信的?
67、为什么线程通信的方法 wait(), notify()和notifyAll()被定义在 Object 类里?
68、为什么 wait(), notify()和 notifyAll ()必须在同步方法或者同步块中被调用?
69、为什么 Thread 类的 sleep()和 yield ()方法是静态的?
70、如何确保线程安全?
71、同步方法和同步块,哪个是更好的选择?
72、如何创建守护线程?
73、什么是 Java Timer 类?如何创建一个有特定时间间隔的任务?
1、在 java 中守护线程和本地线程区别?