目录
前言
这是我从网上找到的题目,代码我自己打的,只注重了功能,代码的效率或者其他的都没有考虑太多。
题目1
- 基础概念
-
请描述Thread类中的start()方法与run()方法的区别。
线程对象调用run方法不开启线程,仅是对象调用方法。线程对象调用start方法,会开启线程,并让jvm调用run方法在开启的线程中执行。 -
请描述创建线程的两种方式。
- 继承Thread类
- 也就是创建Thread子类,并且重写run方法,run方法中的方法体的就是该线程要执行的任务
- 创建Thread子类实例
- 调用线程对象的start方法
- 创建一个类并且实现Runnable接口
- 重写该接口的run方法,方法体就是该线程要执行的任务
- 创建实现Runnable接口的对象,即线程对象
- 创建Thread类的对象,并且把线程对象作为Thread构造函数的参数
- 利用Thread对象调用start方法
- 继承Thread类
-
题目2
- 请编写程序,分别打印主线程的名称和子线程的名称。
要求使用两种方式实现:
第一种方式:继承Thread类。
第二种方法:实现Runnable接口。
方式一代码:
public class ExtendThread extends Thread{
public ExtendThread(String name) {
super(name);
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
方式二代码:
public class ImpRunable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
题目3
- 请描述实现Runnable接口比继承Thread类所具有的优势:
- 适合多个相同的程序代码的线程去共享同一个资源
- 可以避免java中的单继承的局限性
- 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和数据独立
- 线程池只能放入实现Runnable或者是callable类线程,不能直接放入继承Thread的类
题目4
-
请描述在线程的生命周期中, 有几种状态呢 ?
- 新建:线程刚被创建,但是并未启动
- 可运行:线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器
- 锁阻塞:当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态,当该线程持有锁时,该线程将变成Runnable状态。
- 无限等待:一个线程在等待另一个线程执行一个唤醒动作时,该线程进入waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能唤醒。
- 计时等待:同waiting状态,有几个有超时参数,调用他们将进入Timed Waiting状态。这一状态一直保持到超时期或者接受唤醒通知。带有超时参数的常用方法有Thread.sleep,Object.wait
- 被终止
因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。