本帖最后由 冯瑞君老师 于 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()都会导致线程终止)







1 个回复

倒序浏览
用起来用起来
width:100%">
您需要登录后才可以回帖 登录 | 加入黑马