本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看< 活动链接 >
下面将面试中常见问题进行汇总,关于线程部分常遇见的问题如下:
1、使用过线程么?线程如何实现?
通过继承 Thread 类、实现Runnable 接口,在run方法中实现功能或业务逻辑。
2、线程中start和run方法有什么区别和联系?
调用start方法可启动线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,即:线程要执行的内容。
而run方法只是线程里面一个普通方法的调用而已,还是在主线程里执行。如果直接调用run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
public static void main(String args[]) {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.start();
System.out.print("ping");
}
public static void pong() {
System.out.print("pong");
}
复制代码
输出结果:
pingpong
public static void main(String args[]) {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.run();
System.out.print("ping");
}
public static void pong() {
System.out.print("pong");
}
复制代码
输出结果:
pongping
通过以上两个程序实例,可以很容易的区分出start()方法和run()方法的区别:
- t.start(); 该行代码相当于是启动线程
- t.run(); 该行代码相当于是使用t这个类中的run方法而已。
3、了解过线程死锁么?如何有效的避免线程死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外界作用下,它们都将无法进行下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。