多线程面试题

Posted Java患者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程面试题相关的知识,希望对你有一定的参考价值。

每天叫醒你的不是闹钟,而是梦想

Q1

实现多线程的两种方法

/**
* 实现线程的第二种方式
* @author iyuetaoli
*
*/

public class ThreadDemo1 {
 public static void main(String[] args) {
   MyThread1 mt = new MyThread1();        //创建线程对象
   mt.start();               //开启线程
   
   for(int i = 0; i < 3000; i++) {
     System.out.println("==============main");
   }
 }

}

/**
*
* @author iyuetaoli
*
  * 定义类继承Thread
 * 重写run方法
 * 把新线程要做的事写在run方法中
 * 创建线程对象
 * 开启新线程, 内部会自动执行run方法
*/

class MyThread1 extends Thread{       //定义类继承Thread

 @Override
 public void run() {               //重写run方法
   /**
    * 把新线程要做的事写在run方法中
    */

   for(int i = 0; i < 3000; i++) {
     System.out.println("==============MyThread");
   }
 }
 
}


/**
* 实现线程的第二种方式
* @author iyuetaoli
*
*/

public class ThreadDemo2 {
 public static void main(String[] args) {
   MyRunnable mr = new MyRunnable();
   Thread t = new Thread(mr);
   t.start();
   
   for(int i = 0; i < 3000; i++) {              //3,将要执行的代码,写在run方法中
     System.out.println("===============main");
   }
 }

}

/**
  * 实现Runnable
 * 定义类实现Runnable接口
 * 实现run方法
 * 把新线程要做的事写在run方法中
 * 创建自定义的Runnable的子类对象
 * 创建Thread对象, 传入Runnable
 * 调用start()开启新线程, 内部会自动调用Runnable的run()方法  
* @author iyuetaoli
*
*/

class MyRunnable implements Runnable{

 @Override
 public void run() {
   for(int i = 0; i < 3000; i++) {              //3,将要执行的代码,写在run方法中
     System.out.println("===============MyRunnable");
   }
   
 }
 
}


Q2

多线程的几个常用的方法


sleep()休眠线程

sleep()方法属于Thread类,主要的作用是让当前线程停止执行,把cpu让给其他线程执行,但不会释放对象锁和监控的状态,到了指定时间后线程又会自动恢复运行状态


setDaemon()守护线程

设置一个线程为守护线程, 该线程不会单独执行, 当其他非守护线程都执行结束后, 守护线程会自动退出


join()加入线程

当前线程暂停, 等待指定的线程执行结束后, 当前线程再继续

wait() notify()


wait()属于Object类,与sleep()的区别是当前线程会释放锁,进入等待此对象的等待锁定池。

当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态。

当执行notify/notifyAll方法时,会唤醒一个处于等待该 对象锁 的线程,然后继续往下执行,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再释放锁。

比方说,线程A调用Obj.wait(),线程A就会停止运行,而转为等待状态。至于等待多长时间? 那就看其他线程是否调用Obj.notify().其优势显而易见,成为多个线程之间进行通讯的有手段!


Q3

非静态的同步方法跟静态的同步方法有什么区别


所有的非静态同步方法用的都是同一把锁——实例对象本身.

而所有的静态同步方法用的也是同一把锁——类对象本身.



Q4

一个赛跑游戏,有5个人,我需要枪声一响他们同时动起来,这个同时很重要,要求准确性非常高,因为只有每个人能同时开动,才算公平。每个人用一个线程表示,那么,这5个线程如何保证"同时启动"

如果使用以下Java代码
new CarThread().start();  
new CarThread().start();  
new CarThread().start();    

...

肯定不行,因为有先后顺序的话就无法保证准确性

===============

随后百度到一个方法

即全部线程启动后使用wait(),然后使用notifyAll大家一起开动

Q4

线程的生命周期.

生命周期

       新建 => 创建线程对象

       就绪 => 线程对象已经启动,但是还没有获取到                      CPU的执行权

        运行 => 获取到了CPU的执行权

                阻塞 => 没有CPU的执行权 回到就绪

        死亡 => 代码运行完毕,线程消亡



以上是关于多线程面试题的主要内容,如果未能解决你的问题,请参考以下文章

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!

Java面试题多线程-线程安全

多线程 面试题—线程安全

多线程——线程的运行状态(面试题)

面试题: java多线程 !=!=未看

.NET面试题系列[18] - 多线程同步