Java面试题整理三(各种多线程)

这部分内容较多,慢慢补充,稍安勿躁!

先来张状态转换图:


再来点简单的问题,引入多线程的概念

问题一:进程,线程,程序的区别?

答:

1. 进程,线程,程序的定义
程序:一组指令的有效集合
进程:程序的执行就是进程。也可以把进程看成一个独立的程序,在内存中有其对应的代码空间和数据空间,一个进程所拥有的数据和代码只属于自己。进程是操作系统资源分配的基本单位,也是调度运行的基本单位
线程:线程被人们认为是轻量级的进程,它是进程中单独运行的一路程序。换句话说,就是一个进程可以包含多个线程,并且至少有一个主线程,同时同一进程的线程共享该进程的代码和数据。于此同时,每一个线程又都有自己的堆栈,这些堆栈对于线程来说是私有的。线程是处理机调度的基本单位
2. 那为什么要引入线程呢?
2.1、便于调度
2.2、线程可以共享进程的数据代码,从而比进程需要通过消息才能通信来得更加简单。启动和切换的速度也比进程快。
2.3、具有高并发性,可以启动多个线程执行同程序的不同部分。
2.4、充分利用处理器的功能。让每一个处理器上运行不同线程,从而实现应用程序的并发性。
3. 程序和进程的区别
3.1、程序是静态的,它知识一组冰冷的指令的集合,不具有任何的运行意义。而进程是程序运行在数据集上的动态过程,进程是一个动态实体,它应创建而产生,应调度执行,应等待资源或者是事件而处于等待状态,应完成了任务而被撤销,它有自己的生命周期,它反应了程序在数据集上运行的全部动态过程。
3.2、进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程。
3.3、进程还具有并发性交往性,而程序却是封闭的。
4. 进程和线程的区别
4.1、一个进程可以拥有多个线程,而一个线程同时只能被一个进程所拥有。
4.2、进程是资源分配的基本单位,线程是处理机调度的基本单位,所有的线程共享其所属进程的所有资源与代码。
4.3、线程执行过程之中很容易进行协作同步,而进程需要通过消息通信进行同步。
4.4、线程的划分尺度更小,并发性更高
4.5、线程共享进程的数据的同时,有自己私有堆栈
4.6、线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口。它必须组成进程才能被执行。

问题二:Java中多线程同步是什么?
答:

在多线程程序下,同步能控制对共享资源(有可能只是代码块,或者一个实例,一个变量)的访问。如果没有同步,当一个Java线程在修改一个共享变量时,另外一个线程正在使用或者更新同一个变量,这样容易导致程序出现错误的结果。

问题三:Java中线程的实现方式,以及启动方法。

答:线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,

问题四:线程状态的转变流程图,画图示意。(图在上面,流程只是有几个关键节点一定要讲出,已经标红!)

1、new了这个对象后,线程就进入了初始状态;
   2、当该对象调用了start()方法,就进入可运行状态;
   3、进入可运行状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态;
   4、进入运行状态后情况就比较复杂了
   4.1、run()方法或main()方法结束后,线程就进入终止状态;
   4.2、当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片;
   4.3、线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态;
   4.4、当线程刚进入运行状态(注意,还没运行),发现将要调用的资源被synchroniza(同步),获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配CPU时间片;
   4.5、当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。

问题五:多线程有几种实现方式?

Java线程可以实现Runnable接口或者继承Thread来实现,当你打算多重继承时,优先选择实现Runnable。

问题四:同步有几种实现方式




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值