多线程面试题
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的执行权 回到就绪
死亡 => 代码运行完毕,线程消亡
以上是关于多线程面试题的主要内容,如果未能解决你的问题,请参考以下文章