首页 > 代码库 > Java 多线程知识点整理

Java 多线程知识点整理

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.