1.如何停止一个正在运行的线程?
使用共享变量,用volatile变量修饰,线程循环去访问该变量。如果线程因为发生某些事件进行阻塞,可以使用Thread的interrupt方法。可以使一个被阻塞的线程抛出一个中断异常,从而使线程提前结束阻塞状态,退出堵塞代码。
class MyThread extends Thread { volatile boolean stop = false; public void run() { while (!stop) { System.out.println(getName() + " is running"); try { sleep(1000); } catch (InterruptedException e) { System.out.println("week up from blcok..."); stop = true; // 在异常处理代码中修改共享变量的状态 } } System.out.println(getName() + " is exiting..."); } } class InterruptThreadDemo { public static void main(String[] args) throws InterruptedException { MyThread m1 = new MyThread(); System.out.println("Starting thread..."); m1.start(); Thread.sleep(3000); System.out.println("Interrupt thread...: " + m1.getName()); m1.stop = true; // 设置共享变量为true m1.interrupt(); // 阻塞时退出阻塞状态 Thread.sleep(3000); // 主线程休眠3秒以便观察线程m1的中断情况 System.out.println("Stopping application..."); } }
2.sleep()和 wait()有什么区别?
sleep方法是Thread类的方法,有一个参数指定当前线程休眠的毫秒数。wait是Object类的方法,导致当前线程等待。最大的不同是在等待时wait方法时会释放锁,而sleep方法会一直持有锁。wait通常被用于线程间交互,sleep通常被用于暂停执行。
3.notify()和notifyAll()有什么区别?
notify是随机唤醒一个等待某个资源的线程,进入就绪队列等待CPU的调度,notifyAll是唤醒所有的,进入就绪队列等待CPU调度
4.什么叫线程安全?
当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。
5.CopyOnWriteArrayList可以用于什么应用场景?
CopyOnWriteArrayList用于替代同步List,在某些情况下它提供了更好的并发性能,并且在迭代期间不需要对容器进行加锁或复制。当容器的规模较大时,仅当迭代操作远远多于修改操作时,才应该使用“写入时复制”容器。
6.
Java 多线程知识点整理
时间: 2024-10-01 10:26:38