本帖最后由 冯瑞君老师 于 2020-9-23 15:30 编辑
面试经验-面试题分析解答
一.相关概念 程序:静态的代码 进程:动态执行的程序 线程:进程中要同时干几件事时,每一件事的执行路径成为线程。线程有6种状态:新建,运行(可运行),阻塞,等待,计时等待和终止。
知道线程后,要知道下面这两种情况: 并行:多个CPU同时执行多个任务,比如:多个人同时做不同的事
并发:一个CPU(采用时间片)同时执行多个任务,比如秒杀平台,多个人做同件事.
二.如何创建一个线程?
有两种方法可以创建新的执行线程。(主要的)
1.继成java.lang.Thread, 重写run()方法。[Java] 纯文本查看 复制代码 public class Main {
public static void main(String[] args) {
new MyThread().start();
}
}
class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "\t" + Thread.currentThread().getId());
}
} Thread 类
[Java] 纯文本查看 复制代码 package java.lang;
public class Thread implements Runnable {
// 构造方法
public Thread(Runnable target);
public Thread(Runnable target, String name);
public synchronized void start();
} Runnable 接口
[Java] 纯文本查看 复制代码 package java.lang;
@FunctionalInterface
public interface Runnable {
pubic abstract void run();
}
2.实现java.lang.Runnable接口,重写run()方法,然后使用Thread类来包装[Java] 纯文本查看 复制代码 public class Main {
public static void main(String[] args) {
// 将Runnable实现类作为Thread的构造参数传递到Thread类中,然后启动Thread类
MyRunnable runnable = new MyRunnable();
new Thread(runnable).start();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "\t" + Thread.currentThread().getId());
}
}
三.区别:- Thread: 继承方式, 不建议使用, 因为Java是单继承的,继承了Thread就没办法继承其它类了,不够灵活
- Runnable: 实现接口,比Thread类更加灵活,没有单继承的限制
- Thread类是实现Runnable,Callable封装成FutureTask,FutureTask实现RunnableFuture,RunnableFuture继承Runnable
四.线程的状态
- 创建(new)状态: 准备好了一个多线程的对象,即执行了new Thread(); 创建完成后就需要为线程分配内存
- 就绪(runnable)状态: 调用了start()方法, 等待CPU进行调度
- 运行(running)状态: 执行run()方法
- 阻塞(blocked)状态: 暂时停止执行线程,将线程挂起(sleep()、wait()、join()、没有获取到锁都会使线程阻塞), 可能将资源交给其它线程使用
- 死亡(terminated)状态: 线程销毁(正常执行完毕、发生异常或者被打断interrupt()都会导致线程终止)
|