多线程与部分面试题

一、程序、进程、线程

1)什么是程序?

可执行文件例如:QQ.exe

2))什么是进程?

资源分配的基本单元

3)什么是线程?

调度执行的基本单位

4)线程切换(context switch)

T1线程被调度执行到指令2时,突然 T2线程调度器选中,T1将会被扔进一个缓冲中,先将T2线程执行,来回切换 直到 所有线程执行完成。

5)单核CPU设定多线程是否有意义?

有 当第一个线程在等待状态时 可以让第二个线程先执行 充分利用CPU

6)线程数是不是越大越好

不是 线程切换是需要消耗CPU资源的

7)线程数多少合适?

首先考虑的是CPU核数,一般是要进行压测才能确定设置多少线程数合适,但是也有公式来计算线程数。

8)如何优雅的结束一个线程?

stop() 不建议,已经被弃用

volatile 标志位

interrupt() + isInterrupted()

9)为什么不建议使用stop方法?

使用stop会释放所有锁,会产生数据不一致问题

二、创建线程的三种方式

1)类继承Thread方法

缺点:

  • 无返回值

  • 不能抛出异常

1.如何启动子线程

重写父类的run方法,将代码逻辑放在run方法内部。不能直接调用run方法,如果直接调用run方法,run方法将会是一个普通的类。

所以需要调用父类的 start方法来启动子线程

2.设置/获取线程名

  • 通过set

    • 主线程: 设置:Thread.currentThead.setName(name) 获取:Therad.currentTheand.getName()

    • 子线程: 设置run方法内:this.setName(name)/super.setName(name) 获取:对象.getName()

  • 构造器

    public TestThread(String name){
            super(name);
    }

2)实现Runnable接口

  • 缺点:

  • 无返回值

  • 不能抛出异常

3)实现Callable接口

优点:

  • 有返回值

  • 能抛出异常

三、线程的生命周期

 

四、常见方法

1) 设置优先级

1.同优先级别的线程,采取策略就是先到先服务,使用时间片策略。

2.如果优先级别高,被CPU调度的几率就高。

3.级别 1 ~ 10 默认 是 5

2)join 阻塞

当一个线程调用了join()方法,这个线程就会被先执行,它执行结束后才可以去执行其余的线程。

注意:必须先start,再join才有效

3)sleep 人为制造阻塞时间

4)设置伴随(守护)线程 setDaemon

先设置在启动

5)stop

五、线程安全

原因:多个线程在争抢资源的过程中,导致共享资源出现问题。一个线程还没有被执行完成,就被另外一个线程参与进来。

解决:

加同步 ——> 同步监视器

1)同步代码块

public class BuyTicketThread extends Thread {
    static int ticketNum = 10;
    public BuyTicketThread(String name){
        super(name);
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            synchronized (this) {
                System.out.println(this.getName() + ": 买到一张票,还剩余:" + --ticketNum);
                if (ticketNum == 0){
                    break;
                }
            }
        }
    }
}

 

2)同步方法

总结1:

多线程在争抢资源,就要实现线程的同步 就要进行加锁,并且这个锁必须是共享的,必须是唯一的。

目的:解决线程安全问题。

总结2:关于同步方法

1)不要讲run()定义为同步方法

2)非静态同步方法的同步监视器是this

静态同步方法的同步监视器是 类名.class 字节码对象

3)同步代码块的效率要高于同步方法

原因:同步方法是将线程挡在了方法的外部,而同步代码块锁将线程挡在了代码块的外部,但却是方法的内部。

4)同步方法的锁是this,一旦锁住了一个方法,就锁住了所有的同步方法;同步代码块只是锁住了使用该同步监视器的代码块,而没有锁住其它监视器的代码块。

3)Lock锁

1)Lock和synchronized的区别

  • Lock是显式锁(手动开启手动关闭),synchronized是隐式锁

  • Lock只有代码块锁,synchronized有代码块锁和方法锁

  • 使用Lock锁,Jvm将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性。

2)优先使用顺序:

Lock —— 同步代码块 —— 同步方法

4) 线程同步的优缺点

锁 效率低 安全

效率高 不安全

2) 死锁

3)解决办法: 尽量避免锁,避免锁嵌套

=========================================================================

小白一枚~ 若有问题敬请指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值