美文网首页
最全的BAT大厂面试题整理

最全的BAT大厂面试题整理

作者: 哲哲哥 | 来源:发表于2018-03-09 17:16 被阅读0次

    线程,多线程和线程池

    1.开启线程的三种方式?

    1.继承Thread类
    2.实现Runnable接口
    3.实现callable接口,重写call方法

    2.线程和进程的区别?

    1.线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
    2.一个进程是一个或者多个线程组成,线程是一个进程中代码执行的不同路线
    3.进程之间相互独立。但同一个进程之间的线程共享内存空间以及进程级的资源,某进程的线程在其他进程是看不到的。
    4.调度和切换:线程上下文切换比进程上下文切换要快的多。

    3.为什么要有线程,而不是仅仅用进程?

    1.早期的确是这样的,但是后面随着计算机的发展,进程之间的切换是在太耗时间了。
    2.进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了
    3.进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行

    4.如何控制某个方法允许并发访问线程的个数?

    static Semaphore semaphore = new Semaphore(5,true)
    .....
    semaphore.acquire();
    .....
    semaphore.release();

    Seamphore是一组信号量,用于管理一组资源。他也是实现了AQS抽象类,在许可不够时,线程会被挂起;而一旦一个线程释放一个资源,那么
    ,那么就可能重新唤醒等待队列中的线程继续执行。
    Seamphore分为公平模式和非公平模式。

    5.在Java中wait和seelp方法的不同;

    1.这两个方法来自不同的类分别是Thread和object
    2.sleep没有释放锁而wait释放了锁、
    3.wait,notify,notifyall只能在同步控制方法或者在同步控制块中使用,而sleep可以在任何地方使用
    4.sleep是一个静态方法,可以使得当前数线程进入休眠状态并且到了一定时间会自动醒来。
    5.当我们调用了wait方法时,必须采用notify和notifyall来唤醒该线程。

    6.yield()和join()

    yield()方法是停止当前线程,让同等优先权的线程或更高优先级的线程有执行的机会。如果没有的话,那么yield()方法将不会起作用,并且由可执行状态后马上又被执行。

    join方法是用于在某一个线程的执行过程中调用另一个线程执行,等到被调用的线程执行结束后,再继续执行当前线程。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。

    7.什么导致线程阻塞

    阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才恢复运行。或者是被其他的线程中断,该线程也会退出阻塞状态,同时抛出InterruptedException

    1)线程执行了Thread.sleep(intmillsecond);方法,当前线程放弃CPU,睡眠一段时间,然后再恢复执行

    2)线程执行一段同步代码,但是尚且无法获得相关的同步锁,只能进入阻塞状态,等到获取了同步锁,才能回复执行。

    3)线程执行了一个对象的wait()方法,直接进入阻塞状态,等待其他线程执行notify()或者notifyAll()方法。

    4)线程执行某些IO操作,因为等待相关的资源而进入了阻塞状态。比如说监听system.in,但是尚且没有收到键盘的输入,则进入阻塞状态。

    8.线程如何关闭?

    1.使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
    2.使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。
    3.使用interrupt方法中断线程。

    Thread.java类中提供了两种方法:
    this.interrupted(): 测试当前线程是否已经中断;
    this.isInterrupted(): 测试线程是否已经中断;
    能停止的线程--异常法
    测试一下线程是否停止了,然后抛出异常。
    https://www.cnblogs.com/greta/p/5624839.html

    9.java中同步的方法

    1.同步方法synchronize
    2.同步代码块
    3.volatile
    4.使用重入锁ReentrantLock
    5.使用局部变量ThreadLocal实现.

    10.两个进程同时要求写或者读,能不能实现?如何防止进程的同步?

    不能同时对一个文件写操作,因为这样会对数据造成不一致性。对同一个文件进行读是可以的,可以使用读写锁。

    11.线程间操作List

    https://my.oschina.net/infiniteSpace/blog/305425

    要使用Collection..synchronizedList(new ArrayList<E>())
    但是在进行操作的时候得保证使用同一把锁的对象。

    12.Java中对象的生命周期

    重jvm的角度上了说,类要经过加载,连接,初始化,使用,卸载阶段。

    相关文章

      网友评论

          本文标题:最全的BAT大厂面试题整理

          本文链接:https://www.haomeiwen.com/subject/lbeyfftx.html