欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    Android面试Java中级试题.docx

    • 资源ID:11528611       资源大小:29.83KB        全文页数:23页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Android面试Java中级试题.docx

    1、Android面试Java中级试题Android面试Java中级试题本文是Android面试题整理中的一篇,结合右下角目录食用更佳,包括:线程线程中的关键字线程池多线程中的工具类进程类加载范型和反射线程1. 什么是线程线程是操作系统能够进行调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,可以使用多线程对进行运算提速。2. 编写多线程的几种方式1.一种是继承Thread类;2.另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runn

    2、able接口更为灵活。3.实现Callable接口,该接口中的call方法可以在线程执行结束时产生一个返回值3. 什么是FutureTaskFutureTask实现了Future接口和Runnable接口,可以对任务进行取消和获取返回值等操作。4. 如何强制启动一个线程做不到,和gc一样,只能通知系统,具体何时启动有系统控制5. 启用一个线程是调用run()还是start()方法启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行6. 说出线程调度和线程同步的方法线程调度1.wait( ):Object方

    3、法,必须在同步代码块或同步方法中使用,使当前线程处于等待状态,释放锁2.notify ( ):Object方法,和wait方法联合使用,通知一个线程,具体通知哪个由jvm决定,使用不当可能发生死锁3.notifyAll ( ):Object方法,和wait方法联合使用,通知所有线程,具体哪个线程获得运行权jvm决定4.sleep( ):使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常7. 线程同步1.Synchronized修饰方法2.Synchronized修饰代码块3.Lock/ReadWriteLock4.ThreadLoca

    4、l:每个线程都有一个局部变量的副本,互不干扰。一种以空间换时间的方式5.java中有很多线程安全的容器和方法,可以帮助我们实现线程同步:如Collections.synchronizedList()方法将List转为线程同步;用ConurrentHashMap 实现hashmap的线程同步。BlockingQueue阻塞队列也是线程同步的,非常适用于生产者消费者模式6.扩展:volatile(volatile修饰的变量不会缓存在寄存器中,每次使用都会从主存中读取):保证可见性,不保证原子性,因此不是线程安全。在一写多读/状态标志的场景中使用8. 什么是可重入锁所谓重入锁,指的是以线程为单位,当

    5、一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的9. Java中如何停止一个线程1.Java提供了很丰富的API但没有为停止线程提供API2.可以用volatile 布尔变量来退出run()方法的循环或者是取消任务来中断线程10. 一个线程运行时发生异常会怎样1.如果异常没有被捕获该线程将会停止执行2.可以用UncaughtExceptionHandler来捕获这种异常11. 多线程共享数据1.使用同一个runnable对象2.使用不同的runnable对象,将同一共享数据实例传给不同的runnable3.使用不同的runnable对象,将这些Runnable对

    6、象作为一个内部类,将共享数据作为成员变量12. 多线程的最佳实践/好习惯1.给线程起个有意义的名字2.避免使用锁和缩小锁的范围3.多用同步辅助类(CountDownLatch、CyclicBarrier、Semaphore)少用wait、notify4.多用并发集合少用同步集合13. ThreadLocal的设计理念与作用1.供线程内的局部变量,线程独有,不与其他线程共享2.适用场景:多线程情况下某一变量不需要线程间共享,需要各个线程间相互独立14. ThreadLocal原理,用的时候需要注意什么1.ThreadLocal通过获得Thread实例内部的ThreadLocalMap来存取数据2

    7、.ThreadLocal实例本身作为key值3.如果使用线程池,Threadlocal可能是上一个线程的值,需要我们显示的控制4.ThreadLocal的key虽然采用弱引用,但是仍然可能造成内存泄漏(key为null,value还有值)扩展:Android中的ThreadLocal实现略有不同,使用Thread实例中的是数组存值,通过ThreadLocal实例计算一个唯一的hash确定下标。15. 线程的基本状态及状态之间的关系16. 如果同步块内的线程抛出异常会发生什么1.线程内的异常可以捕获,如果没有捕获,该线程会停止运行退出2.不论是正常退出还是异常退出,同步块中的锁都会释放17. 什

    8、么是死锁(deadlock)两个线程互相等待对方释放资源才能继续执行下去,这个时候就形成了死锁,谁都无法继续执行(或者多个线程循环等待)18. N个线程访问N个资源,如何避免死锁以同样的顺序加锁和释放锁19. 为什么应该在循环中检查等待条件处于等待状态的线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出20. Java中的同步集合与并发集合有什么区别1.同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合2.并发集合性能更高21. Java中活锁和死锁有什么区别这是上题的扩展,活锁和死锁类似,不同之处在于处于活锁的线程或进程的状态是不断改

    9、变的,活锁可以认为是一种特殊的饥饿。一个现实的活锁例子是两个 人在狭小的走廊碰到,两个人都试着避让对方好让彼此通过,但是因为避让的方向都一样导致最后谁都不能通过走廊。简单的说就是,活锁和死锁的主要区别是前者进程的状态可以改变但是却不能继续执行22. 怎么检测一个线程是否拥有锁java.lang.Thread中有一个方法叫holdsLock(),它返回true如果当且仅当当前线程拥有某个具体对象的锁23. Java中ConcurrentHashMap的并发度是什么ConcurrentHashMap把实际map划分成若干部分来实现它的可扩展性和线程安全。这种划分是使用并发度获得的,它是 Concu

    10、rrentHashMap类构造函数的一个可选参数,默认值为16,这样在多线程情况下就能避免争用24. 什么是阻塞式方法阻塞式方法是指程序会一直等待该方法完成期间不做其他事情,ServerSocket的accept()方法就是一直等待客户端连接。这里的阻塞是 指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。此外,还有异步和非阻塞式方法在任务完成前就返回。25. 多线程中的忙循环是什么忙循环就是程序员用循环让一个线程等待,不像传统方法wait(), sleep() 或 yield() 它们都放弃了CPU控制,而忙循环不会放弃CPU,它就是在运行一个空循环。这么做的目的是为了保留CP

    11、U缓存,在多核系统中,一个等待线程醒来的时候可 能会在另一个内核运行,这样会重建缓存。为了避免重建缓存和减少等待重建的时间就可以使用它了。26. 如何保证多线程下 i+ 结果正确可以使用synchronized保证原子性,也可以使用AtomicInteger类扩展:volatile只能保证可见性,不能保证原子性,因此不行27. 简述Java中具有哪几种粒度的锁Java中可以对类、对象、方法或是代码块上锁同步方法和同步代码块的对比1.同步代码块可以指定更小的粒度2.同步代码块可以给指定实例加锁28. 类锁和对象锁类锁其实时一种特殊的对象锁,它锁的其实时类对应的class对象线程中的关键字和类0.

    12、 sleep和wait方法的对比1.两个方法都是暂停线程,释放cpu资源给其他线程2.sleep是Thread的静态方法,wait是Object的方法。3.sleep使线程进入阻塞状态;wait使线程进入等待状态,靠其他线程notify或者notifyAll来改变状态4.sleep可以在任何地方使用,必须捕获异常;而wait必须在同步方法或者同步块中使用,否则会抛出运行时异常5.最重要的:sleep继续持用锁,wait释放锁 扩展:yield停止当前线程,让同优先级或者优先级高的线程先执行(但不会释放锁);join方法在某一个线程的执行过程中调用另一个线程执行,等到被调用的线程执行结束后,再继

    13、续执行当前线程1. 线程的sleep()方法和yield()方法有什么区别1.sleep方法使当前线程阻塞指定时间,随后进入就绪状态2.yield方法使当前线程进入就绪状态,让同优先级或者更高优先级的线程先执行3.sleep方法会抛出interruptedException2. 为什么wait, notify 和 notifyAll这些方法不在thread类里面JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通 过线程获得。如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类中,线程正在等待的是哪个锁 就不明显了3. 为什么wai

    14、t和notify方法要在同步块中调用1.java规定必须在同步块中,不在同步块中会抛出异常2.如果不在同步块中,有可能notify在执行的时候,wait没有收到陷入死锁4. synchronized关键字的用法synchronized 用于线程同步1.可以修饰方法2.可以修饰代码块3.当持有的锁是类时,那么所有实例对象调用该方法或者代码块都会被锁5. synchronized 在静态方法和普通方法的区别1.synchronized修饰静态方法时,锁是类,所有的对象实例用同一把锁2.修饰普通方法时,锁是类的实例6. 当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此

    15、对象的synchronized方法B?不能。其它线程只能访问该对象的非同步方法。第一个线程持有了对象锁,第二个线程的同步方法也需要该对象的锁才能运行,只能在锁池中等待了。7. Java中的volatile 变量是什么1.volatile是一个修饰符,只能修饰成员变量2.volatile保证了变量的可见性(A线程的改变,B线程马上可以获取到)3.volatile禁止进行指令重排序8. 写一个双检锁的单例private static volatile Singleton instance; private Singleton() public Singleton getInstance(if(si

    16、ngleton = null) synchronized(Singleton.class) if(singleton = null) singleton = new Singleton(); return sinlgeton;)9. 单例的DCL方式下,那个单例的私有变量要不要加volatile关键字,这个关键字有什么用1.要加2.两个线程同时访问双检锁,有可能指令重排序,线程1初始化一半,切换到线程2;因为初始化不是一个原子操作,此时线程2读到不为null直接使用,但是因为还没有初始化完成引起崩溃10. Synchronized 和LockReadWriteLock的区别1.Synchron

    17、ized时java关键字,Lock/ReadWriteLock接口,它们都是可重入锁2.Synchronized由虚拟机控制,不需要用户去手动释放锁,执行完毕后自动释放;而Lock是用户显示控制的,要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。3.Lock可以用更多的方法,比如tryLock()拿到锁返回true,否则false;tryLock(long time, TimeUnit unit)方法和tryLock()方法是类似的,只不过区别在于这个方法在拿不到锁时会等待一定的时间;Lock有lockInterruptibly()方法,是可中断锁4.ReentrantLoc

    18、k可以实现公平锁(等得久的先执行)5.ReadWriteLock是一个接口,ReentrantReadWriteLock是它的一个实现,将对一个资源(比如文件)的访问分成了2个锁,一个读锁和一个写锁,提高了读写效率。11. LockSupportLockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语park 方法获取许可。许可默认是被占用的,调用park()时获取不到许可,所以进入阻塞状态 unpark 方法颁发许可12. ReadWriteLock1.读写分离的锁,可以提升效率2.读读能共存,读写、写写不能共存13. 可重入锁(RetrantLock)实现

    19、原理1.RetrantLock 是通过CAS和AQS实现的2.CAS(Compare And Swap):三个参数,一个当前内存值V、旧的预期值A、即将更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。原子性操作3.RetrantLock内部有一个AbstractQueuedSynchronizer实例,AbstractQueuedSynchronizer是一个抽象类,RetrantLock中有两种对他的实现,一种是公平锁,一种是非公平锁4.在lock时,调用一个CAS的方法compareAndSet来将state设置为1,stat

    20、e是一个volitale的变量,并将当前线程和锁绑定5.当compareAndSet失败时,尝试获取锁:如果和锁绑定的线程时当前线程,state+16.如果获取锁失败,将其加入到队列中等待,从而保证了并发执行的操作变成了串行7.扩展:公平锁和非公平锁的区别:非公平锁无视队列,直接查看当前可不可以拿到锁;公平锁会先查看队列,队列非空的话会加入队列14. Otherssynchronized 的实现原理以及锁优化?:Monitorvolatile 的实现原理?:内存屏障CAS?CAS 有什么缺陷,如何解决?CompareAndSwap,通过cpu指令实现的AQS :AbstractQueueSyn

    21、chronizer,是ReentrantLock一个内部类如何检测死锁?怎么预防死锁?:死锁必须满足四个条件,破坏任意一个条件都可以解除死锁Fork/Join框架线程池0. 什么是线程池(thread pool)1.频繁的创建和销毁对象很耗费资源,所以java引入了线程池。Java 5+中的Executor接口定义一个执行线程的工具。它的子类型即线程池接口是ExecutorService。2.Executors 是一个工具类,可以帮我们生成一些特性的线程池newSingleThreadExecutor:创建一个单线程化的Executor,保证所有任务按照指定顺序(FIFO, LIFO, 优先级

    22、)执行。newFixedThreadPool:创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newScheduleThreadPool:创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。复制代码1.我们常用的ThreadPoolExecutor实现了ExecutorService接口,以下是原理和参数说明原理:step1.调用Threa

    23、dPoolExecutor的execute提交线程,首先检查CorePool,如果CorePool内的线程小于CorePoolSize,新创建线程执行任务。step2.如果当前CorePool内的线程大于等于CorePoolSize,那么将线程加入到BlockingQueue。step3.如果不能加入BlockingQueue,在小于MaxPoolSize的情况下创建线程执行任务。step4.如果线程数大于等于MaxPoolSize,那么执行拒绝策略。参数说明:ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keep

    24、AliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)corePoolSize 核心线程池大小maximumPoolSize 线程池最大容量大小keepAliveTime 线程池空闲时,线程存活的时间TimeUnit 时间单位ThreadFactory 线程工厂BlockingQueue任务队列RejectedExecutionHandler 线程拒绝策略扩展:ThreadPoolExecutor 的submit和excut

    25、e方法都能执行任务,有什么区别?1. 入参不同:excute只能接受Runnable,submit可以接受Runnable和Callable2. submit有返回值3. 在异常处理时,submit可以通过Future.get捕获抛出的异常复制代码1. 线程池如何调优,最大数目如何确认1.线程池的调优优根据具体情况具体分析,尽量使系统资源利用率最大2.例如如果cpu效率明显高于IO,那么就应该创建更多线程提高cpu利用率,避免io等待(参考1,参考2)3.Android中最大数目可以是:cpu数目*2+1,但也要根据具体场景,例如picaso会根据网络状况调整最大数目(参考)2. 如果你提交给

    26、ThreadPoolExcuter任务时,线程池队列已满,这时会发生什么1.如果还没达到最大线程数,则新建线程 2.如果已经达到最大线程数,交给RejectExecutionHandler处理。 3.如果没有设置自定义RejectExecutionHandler,则抛出RejectExecutionExcuption3. 线程池的用法与优势优势: 实现对线程的复用,避免了反复创建及销毁线程的开销;使用线程池统一管理线程可以减少并发线程的数目,而线程数过多往往会在线程上下文切换上以及线程同步上浪费过多时间。用法: 我们可以调用ThreadPoolExecutor的某个构造方法来自己创建一个线程池

    27、。但通常情况下我们可以使用Executors类提供给我们的静态工厂方法来更方便的创建一个线程池对象。创建了线程池对象后,我们就可以调用submit或者excute方法提交任务到线程池中去执行了;线程池使用完毕后我们要记得调用shutdown方法来关闭它。多线程中的工具类0. Java并发编程:CountDownLatch、CyclicBarrier(栅栏)和Semaphore(信号量)1.CountDownLatch:利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了public class T

    28、est public static void main(String args) final CountDownLatch latch = new CountDownLatch(2); new Thread() public void run() try System.out.println(子线程+Thread.currentThread().getName()+正在执行); Thread.sleep(3000); System.out.println(子线程+Thread.currentThread().getName()+执行完毕); latch.countDown(); catch (

    29、InterruptedException e) e.printStackTrace(); ; .start(); new Thread() public void run() try System.out.println(子线程+Thread.currentThread().getName()+正在执行); Thread.sleep(3000); System.out.println(子线程+Thread.currentThread().getName()+执行完毕); latch.countDown(); catch (InterruptedException e) e.printStack

    30、Trace(); ; .start(); try System.out.println(等待2个子线程执行完毕.); latch.await(); System.out.println(2个子线程已经执行完毕); System.out.println(继续执行主线程); catch (InterruptedException e) e.printStackTrace(); 复制代码1.CyclicBarrier: 实现让一组线程等待至某个状态之后再全部同时执行public class Test public static void main(String args) int N = 4; Cy

    31、clicBarrier barrier = new CyclicBarrier(N); for(int i=0;iN;i+) new Writer(barrier).start(); static class Writer extends Thread private CyclicBarrier cyclicBarrier; public Writer(CyclicBarrier cyclicBarrier) this.cyclicBarrier = cyclicBarrier; Override public void run() System.out.println(线程+Thread.currentThread().getName()+正在写入数据.); try


    注意事项

    本文(Android面试Java中级试题.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开