java并发常见问题

1.java中有几种方法可以实现一个线程?

  1. 继承Thread
  2. 实现Runnable
  3. 线程池ExecutorService

2.如何停止一个正在运行的线程?

  1. 使用共享变量
    public class StopThread {
    
        private static volatile boolean stopRequested = false;
    
        public static void main(String[] args) throws InterruptedException {
    
            Thread backgroundThread = new Thread(new Runnable() {
    
                @Override
                public void run() {
                    int i = 0;
                    System.out.println("11111");
                        while (!stopRequested) {
                            i++;
                    }
                    System.out.println("22222");
                }
            });
            backgroundThread.start();
    
            TimeUnit.SECONDS.sleep(1);
            stopRequested = true;
            //        backgroundThread.interrupt();
            System.out.println("33333");
        }
    }

  2. 如果线程被阻塞时,可能无法访问共享变量,可以用interrupt来中断线程
    public class StopThread {
    
        private static volatile boolean stopRequested = false;
    
        public static void main(String[] args) throws InterruptedException {
    
            Thread backgroundThread = new Thread(new Runnable() {
    
                @Override
                public void run() {
                    int i = 0;
                    System.out.println("11111");
                        while (!stopRequested) {
                            i++;
                        try {
                            TimeUnit.SECONDS.sleep(10);
                        } catch (InterruptedException e) {
                            System.out.println("线程被中断!");
                            stopRequested = true;
                        }
                    }
                    System.out.println("22222");
                }
            });
            backgroundThread.start();
            //        TimeUnit.SECONDS.sleep(1);
            stopRequested = true;
            backgroundThread.interrupt();
            System.out.println("33333");
        }
    }


  3. 线程中断信号,其实和2是一样的
    public class StopThread {
    
        //    private static volatile boolean stopRequested = false;
    
        public static void main(String[] args) throws InterruptedException {
    
            Thread backgroundThread = new Thread(new Runnable() {
    
                @Override
                public void run() {
                    int i = 0;
                    System.out.println("11111");
                    //                    while (!stopRequested) {
                    while (!Thread.currentThread().isInterrupted()) {
    
                            i++;
                        try {
                            TimeUnit.SECONDS.sleep(10);
                        } catch (InterruptedException e) {
                            System.out.println("线程被中断!");
                            //                        stopRequested = true;
                        }
                    }
                    System.out.println("22222");
                }
            });
            backgroundThread.start();
            //        TimeUnit.SECONDS.sleep(1);
            //        stopRequested = true;
            backgroundThread.interrupt();
            System.out.println("33333");
        }
    }
注:interrupt方法只是发出一个中断信号,并不能立马中断线程的执行,中断线程执行,需要自己拿到线程中断信号后Thread.currentThread().isInterrupted()自行判断,然后处理中断线程

3.notify()和notifyAll()有什么区别?

  1. notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法
  2. void notify(): 唤醒一个正在等待该对象的线程,如果有多个线程都在等待对象锁,则唤醒的一个具有随机性
  3. void notifyAll(): 唤醒所有正在等待该对象的线程。
  4.  两者的最大区别在于:
    notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
    notify他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁,此时如果该对象没有再次使用notify语句,即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是

4.sleep和wait有什么区别?

  1. sleep不会释放占用资源,wait会释放
  2. sleep是Thread的方法,而wait是任何对象都可以
  3. sleep打断要调用interrupt,而wait的对象的唤醒需要调用notify或者notifyall
  4. sleep必须捕获异常
  5. wait必须要合同步块一起使用

5.什么是Daemon线程?它有什么意义?

  1. java语言创建的线程主要有两种,用户线程和守护线程
  2. 守护线程:当线程只剩下守护线程的时候,JVM就会退出.但是如果还有其他的任意一个用户线程还在,JVM就不会退出
  3. 守护线程主要是用来服务用户线程的,如jvm的gc线程就是守护线程

6.java如何实现多线程之间的通讯和协作?

wait,notify,notifyAll,这是Object的三个方法,使用时必须要搭配synchronized关键字

7.什么是可重入锁(ReentrantLock)

//TODO



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值