牛客网---Java题库(11~20)

11、进程和线程的区别是什么?


1、地址空间和其他资源:进程间相互独立,同一进程的各线程间共享。

2、通信:进程间通信PIC,线程间可以直接读写进程数据段(如全局变量)来进行通信(需要通过进程同步和互斥手段以保证)

c.调度和切换:线程上下文切换比进程上下文切换要快得多。

d.在多线程OS中,进程不是一个可执行的实体。

 

12、创建线程有几种不同的方式?你喜欢哪一种为什么?

 1、继承Thread类,是Runnable接口的实现。

 2、实现Runnable接口,并重写里面的run方法。

 

继承于Thread类的线程类,可以直接调用start方法启动线程(使用static也可以实现资源共享).一个线程(对象)只能够执行一次start(),而且不能通过Thread实现类对象的run()去启动一个线程。

实现Runnable接口的类需要再次用Thread类包装后才能调用start方法。(三个Thread对象包装一个类对象,就实现了资源共享)。

线程的使用的话,注意锁和同步的使用。(多线程访问共享资源容易出现线程安全问题)

 

 

一般情况下,常见的是第二种。

* Runnable接口有如下好处:

*①避免点继承的局限,一个类可以继承多个接口。

*②适合于资源的共享

* Thread的常用方法:

 * 1.start():启动线程并执行相应的run()方法

 * 2.run():子线程要执行的代码放入run()方法中

 * 3.currentThread():静态的,调取当前的线程

 * 4.getName():获取此线程的名字

 * 5.setName():设置此线程的名字

 * 6.yield():调用此方法的线程释放当前CPU的执行权(很可能自己再次抢到资源)

 * 7.join():在A线程中调用B线程的join()方法,表示:当执行到此方法,A线程停止执行,直至B线程执行完毕,

 * A线程再接着join()之后的代码执行

 * 8.isAlive():判断当前线程是否还存活

 * 9.sleep(long l):显式的让当前线程睡眠l毫秒  (只能捕获异常,因为父类run方法没有抛异常)

 * 10.线程通信(方法在Object类中):wait()   notify()  notifyAll()

设置线程的优先级(非绝对,只是相对几率大些)

 * getPriority():返回线程优先值

 * setPriority(int newPriority):改变线程的优先级

 

13、概括的解释下线程的几种可用状态

1.新建(new):新创建了一个线程对象。

2.可运行(Runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。

3.运行(Running):可运行状态(Runnable)的线程获得了cpu时间片,执行程序代码。

4.阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu的使用权,让出了cpu的时间片。暂停后,直到线程到可运行(Runnable)状态,才会有机会获得时间片转到(running)运行状态。阻塞被分为三种:

(1)等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把线程放入等待队列中。

(2)同步阻塞运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。

 (3). 其他阻塞: 运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。            当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。

 

5.死亡(dead):线程run()、main()方法执行结束,或者因异常退出run()方法,则该线程生命周期结束。

 

14、同步方法和同步代码块的区别是什么?

区别:

同步方法默认用this或者当前类class对象作为锁;

同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;

同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用   synchronized(object){代码内容}进行修饰;

 

15、在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

 

16、什么是死锁(deadlock)?

死锁就是多个进程因为竞争资源而造成的一种僵局(互相等待)。

死锁的四个条件:互斥条件、不剥夺条件、请求和保持、循环等待。

 

17、如何确保N个线程可以访问N个资源同时又不导致死锁?

多线程产生死锁需要四个条件,分别是互斥性,保持和请求,不可剥夺性还有要形成闭环,这四个条件缺一不可,只要破坏了其中一个条件就可以破坏死锁,其中最简单的方法就是线程都是以同样的顺序加锁和释放锁,也就是破坏了第四个条件。

 

18、java集合类框架的基本接口有哪些?

集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。

java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。

Collection:代表一组对象,每一个对象都有它的子元素。

Set:不包含重复元素的Collection

List:有顺序的Collocation,并且包含重复元素

Map:可以把键(key)映射到值(value)的对象,键不能重复。

19、为什么集合类没有实现cloneable和serializeble接口?

克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的,应该由集合类的具体实现来决定如何来克隆或者是序列化。

 

20、什么是迭代器(lterator)?

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。  

Java中的Iterator功能比较简单,并且只能单向移动:  

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。  

(2) 使用next()获得序列中的下一个元素。  

(3) 使用hasNext()检查序列中是否还有元素。  

(4) 使用remove()将迭代器新返回的元素删除。  

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

你可能感兴趣的:(java)