乐趣区

关于java:Java面试专题多线程篇1

开篇介绍

大家好,公众号【Java 极客思维】近期会整顿一些 Java 高频面试题分享给小伙伴,也心愿看到的小伙伴在找工作过程中可能用失去!本章节次要针对 Java 一些 多线程 高频面试题进行分享。

Q1:

线程 和 过程有什么区别?

过程:

过程是程序运行资源分配的最小单位。过程外部有多个线程,会共享这个过程中的资源。

线程:

线程是 CPU 调度的最小单位。必须依赖过程而存在。

特点:

  • 线程的划分尺度小于过程,这使得多线程领有高并发性;
  • 过程在运行时各自内存单元互相独立,线程之间内存共享;
  • 多线程开发能够领有更好的性能和用户体验。

(留神:多线程开发对于其余程序是不敌对的,占据大量 CPU 资源。)

Q2:

如何平安的终止线程?

了解中断:

线程天然终止:天然执行完 或 抛出未解决的异样。Java 线程是合作式工作,而非抢占式工作;

  • stop()、resume()、suspend()三个办法曾经在后续的 jdk 版本已过期,不倡议应用;

    • stop()办法:会导致线程不正确开释资源;
    • suspend()办法:挂起,容易导致死锁;
  • 三种中断形式:

    • interrupt()办法:interrupt()办法中断一个线程,并不是强制敞开该线程,只是跟线程打声招呼,将线程的中断标记地位为 true,线程是否中断,由线程自身决定;
    • inInterrupted()办法:判断以后线程是否处于中断状态;
    • static 办法 interrupted()办法:判断以后线程是否处于中断状态,并将中断标记地位为 false;

(留神:办法里如果抛出 InterruptedException,线程的中断标记位会被置为 false,如果的确须要中断线程,则须要在 catch 外面再次调用 interrupt()办法。)

Q3:

sleep() 和 wait() 有什么区别?

sleep()办法:

  • Thread 类中的静态方法;
  • 当一个线程调用 sleep()办法当前,不会开释同步资源锁,其余线程依然会期待资源锁的开释。

wait()办法:

  • Object 类提供的一个一般办法;
  • 而且必须同步资源锁对象在同步代码块或者同步办法中调用。当调用 wait()办法后,以后线程会立即开释掉同步锁资源。其余线程就有机会取得同步资源锁从而持续往下执行。

Q4:

notify() 和 notifyAll() 办法有什么区别?

尽量应该利用 notifyAll()办法,如果用 notify()办法的话,jvm 会执行曾经退出期待线程栈外面的第一个线程,给咱们的一种感官就是随机的抉择了一条线程,如果该线程达到条件就正好执行那一条,其实这是一个误区,这只是 jvm 会抉择在线程栈外面的第一个线程来唤醒。因而用 notify()办法的话,可能会造成信号失落的状况。

Q5:

调用 yield()、sleep()、wait()、notify()等办法对锁有何影响?

  1. 线程在执行 yield()当前,持有的锁是不会开释的;
  2. sleep()办法被调用当前,持有的锁是不会开释的;
  3. 调用办法之前,必须要先持有锁。调用了 wait()办法当前,锁就会被开释,当 wait 办法返回的时候,线程会从新持有锁;

4. 调用办法之前,必须要先持有锁。调用 notify()办法自身不会开释锁。

Q6:

创立多线程的形式有哪些?

形式一:继承 Thread 类

Thread 实质上也是实现了 Runnable 接口的一个实例,它代表一个线程的实例,并且启动线程的惟一办法就是通过 Thread 类的 start()实例办法。start()办法是一个 native 办法,它将启动一个新线程,并执行 run()办法。这种形式实现多线程很简略,通过本人的类间接 extend Thread,并重写 run()办法,,就能够启动新线程并执行自定义的 run()办法。例如:继承 Thread 类实现多线程,并在适宜的中央启动线程。

public class MyThread extends Thread {​  public void run() {System.out.println("MyThread.run()");
  }
}

MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
myThread1.start();
myThread2.start();

形式二:实现 Runnable 接口的形式实现多线程,并且实例化 Thread,传入本人的 Thread 实例,调用 run()办法

public class MyThread implements Runnable {public void run() {System.out.println("MyThread.run()");
  }
}

MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();

形式三:通过 Callable 和 Future 创立线程

class T implements Callable<String> {
  @Override
  public String call() throws Exception {return null;}
}

今天,会介绍多线程一些深刻的常识,长按二维码关注我吧~

祝大家都能拿到心仪的 offer!


点关注、不迷路

如果感觉文章不错,欢送 关注 点赞 珍藏,你们的反对是我创作的能源,感激大家。

如果文章写的有问题,请不要悭吝,欢送留言指出,我会及时核查批改。

如果你还想更加深刻的理解我,能够微信搜寻「Java 极客思维」进行关注。每天 8:00 准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!

退出移动版