java多线程机制
1.线程创建的两种方法。
答:第一种是用Thread类:在创建线程对象时必须向构造方法的参数传递一个实现Runnable接口的类的实例,称该实例为线程的目标对象,在线程调用start()方法后,一旦轮到它来享用CPU资源,目标对象就会自动调用接口中的run()方法。
第二种是用Thread类的子类:子类需要重写父类的run()方法,其目的是规定线程的具体操作,Thread类中的run()方法没有任何操作语句。
2.线程有几种状态及各自特点。
答:新建(NEW)、就绪(RUNNABLE)、运行(RUNNING)、中断(BLOCKED、WAITING 、TIMED_WAITING)和死亡(TERMINATED)。
new(新建):当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。一个线程在调用new()方法之后,调用start()方法之前所处的状态。
runnable(就绪):一旦线程调用了start()方法,线程就转到Runnable()状态。注意,如果线程处于Runnable状态,它也有可能不在运行,这是因为还存在优先级和调度问题。
running(运行状态):线程正在占用CPU时间。
blocked(阻塞/挂起状态):线程处于阻塞状态。这是由两种可能性造成的:因挂起而暂停;由于某些原因而阻塞,例如等待IO请求的完成等。
TERMINATED(终止状态):线程转到退出状态。这有两种可能性:run()方法执行结束或调用了stop()方法。
3.引起线程中断的常见原因。
答:JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权而进入中断状态;线程在使用CPU资源期间执行了sleep(int millsecond)方法,使当前进程进入休眠状态;
线程在使用CPU资源时期执行了wait(),使得当前进程进入等待状态;线程在使用CPU资源期间执行了某个操作进入阻塞状态,比如执行读写操作引起阻塞。
4.线程在什么状态下调用isAlive()方法返回的值为false、true。
答:false:新建(NEW)和死亡(TERMINATED)状态;
true:线程调用start()方法后,没有进入死亡(TERMINATED)状态前。
5.在线程中为什么要引入同步机制。
答:java使用户可以创建多个线程,在处理多线程问题时,用户必须注意这样一个问题:两个或多个线程同时访问一个变量,并且一个线程需要修改这个变量。用户应对这样的问题作出处理,否则可能发生混乱。
6.简述线程同步。
答:所谓线程同步就是若干个线程都要使用一个用synchronized修饰的方法,即程序中的若干个线程都需要使用一个方法,而这个方法用synchronized给予了修饰。当一个线程A使用一个用synchronized修饰的方法时,其他线程若想使用此方法就必须等待线程A使用完。
7.线程调用interrupt()方法的作用是什么。
答:吵醒休眠的进程。一个占用CPU资源的线程可以让休眠的线程调用interrupt()方法吵醒自己,即导致休眠的线程发生InterruptedExpection异常,从而结束休眠,重新排队等待CPU资源。
8.怎样协调同步的进程。
答:当一个线程使用的同步方法中用到某个变量,而次变量又需要其他进程修改后才符合本线程要求时,可以在同步方法中使用wait()方法。wait()方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。如果其他线程在使用这个同步方法时不需要等待,那么它使用完这个方法的同时应当调用notifyAll()方法通知所有由于使用这个同步方法而处于等待状态的线程结束等待,曾中断的线程会从刚才中断处继续执行这个同步方法,并遵循“先中断先继续”的原则。如使用notify()方法则通知处于等待中的某个线程结束等待。
9.简述线程联合。
答:一个线程A在占有CPU资源期间,可以让其它线程调用join()和本线程联合,如:
B.join();
称A在运行期间联合了B。如果线程A在占有CPU资源期间一旦联合B线程,那么A线程将立刻中断执行,一直等到它联合的线程B执行完毕,A线程再重新排队等待CPU资源,以便恢复执行。如果A准备联合的B线程已经结束,那么B.join()不会产生任何效果。
10.简述守护线程。
答:一个线程调用void setDaemon(boolean on)方法可以将自己设置成一个守护(Daemon)线程,例如:
thread.setDaemon(true);
当程序中的所有用户线程都已结束运行时,即使守护线程的run方法中还有需要执行的语句,守护线程也立刻结束运行。
11.简述GUI线程。
答:当Java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue和AWT-Windows。AWT-EventQuecue线程负责处理GUI事件,AWT-Windows线程负责将窗体或组件绘制到桌面。JVM要保证各个线程都有使用CPU资源的机会,比如,程序中发生GUI界面事件时,JVM就会将CPU资源切换给AWT-EventQuecue线程,AWT-EventQuecue线程就会来处理这个事件。
12.简述目标对象与线程的关系。
答:
目标对象和线程完全解耦
目标对象没有组合线程对象。目标对象经常需要通过获得线程的名字(因为无法获得线程对象的引用)以便确定是哪个线程正在占用CPU资源,即被JVM正在执行的线程。
目标对象组合线程(弱耦合)
目标对象可以组合线程。目标对象类组合线程对象时, 目标对象可以通过获得线程对象的引用。
13.什么是线程调度&优先级。
答:处于就绪状态的线程首先进入就绪队列排队等候CPU资源,同一时刻在就绪队列中的线程可能有多个。Java虚拟机(JVM)中的线程调度器负责管理线程,调度器把线程的优先级分为10个级别,分别用Thread类中的类常量表示。
Java调度器的任务是使高优先级的线程能始终运行,一旦时间片有空闲,则使具有同等优先级的线程以轮流的方式顺序使用时间片。
14.操作系统与进程、进程与线程的关系。
答:
操作系统与进程:
程序是一段静态的代码,它是应用软件执行的蓝本。
进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。
现代操作系统可以同时管理一个计算机系统中的多个进程,即可以让计算机系统中的多个进程轮流使用CPU资源。
进程与线程:
线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程。
线程间可以共享进程中的某些内存单元(包括代码与数据),线程的中断与恢复可以更加节省系统的开销。
泛型与集合框架
1.什么是泛型。
答:泛型也称为模板或参数多态。泛型就如同一种形参,只不过它表示的不是数值,而是某种数据类型。程序中可以定义泛型类、泛型方法甚至泛型接口。首先,在类、接口、方法的定义时用一个通用名称(如type, E)代替所操作的具体数据类型。而在具体应用时再把这个参数用真正的类型名称替换掉。这就是所谓的参数化类型。
2.遍历List集合有哪几种方法。
答:
方法1:通过for循环和get()方法配合实现遍历;
方法2:通过foreach语句,只需给出元素类型,循环变量及集合即可;
方法3:通过迭代器Iterator实现遍历
所有集合接口和类都没有提供相应遍历方法,而是由Iterator实现集合遍历
Collection 接口的iterate()方法返回一个Iterator,然后通过Iterator接口的两个方法可实现遍历
boolean hasNext(): 判断是否存在另一个可访问的元素
Object next(): 返回要访问的下一个元素
3.ArrayList和LinkedList有何异同。
答:ArrayList和LinkedList类都实现了List接口。
ArrayList:采用顺序存储结构。实现了长度可变的数组,在内存中分配连续的内存空间,遍历和随机访问元素的效率较高。
LinkedList:采用链式存储结构。插入、删除元素时的效率较高。
4.集合框架中的接口Collection、List、Set、Map各有什么特点。
答:
Collection接口存储一组不唯一、无序的对象;
List接口存储一组不唯一、有序的(插入顺序)的对象;
Set接口存储一组唯一、无序的对象;
Map接口存储一组键值对象,提供key到value的映射。
5.为什么要引入泛型集合。
答:java泛型可以建立具有类型安全的数据结构,如链表、散列表等数据结构,最重要的一个优点是在使用这些泛型类建立数据结构时不必进行强制类型转换,即不要求进行运行时的类型检查。java推出泛型的主要目的是建立具有类型安全的数据结构。
Eg.
把任何类型对象通过add(Object obj) 放入List中,认为只是Object类型
通过get(int index) 取出List中元素时必须进行强制类型转换,繁琐而且容易出现异常
使用Map的put(Object key, Object value)和get (Object key)存取对象时存在同样问题
使用Iterator的next()方法获取元素时存在同样问题
6.建立国家英文简称和中文全名间的键值映射,并通过key对value进行操作,应该如何实现数据的存储和操作呢?
答: Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作;最常用的实现类是HashMap。
7.Java集合框架中包含哪些接口和哪些类。
答:Collection接口、Map接口、List接口、Set接口;ArrayList类、LinkedList类、HashSet类、TreeSet类、HashMap类、TreeMap类。
8.集合框架有何好处?
答:数据结构和类库通称为Java的集合框架。集合框架由一组操作对象的接口组成,这些接口定义了不同的数据结构类型。集合框架提供了一个通用的接口——java.util.Collection,其中给出了插入,删除等操作一系列方法声明。Java集合框架为我们提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。我们不必再重新实现链表、散列映射、堆栈等数据结构,只需学会如何使用它们,就可处理实际应用中问题。
java网络编程
1.InetAddress对象使用怎样的格式来表示自己封装的地址信息。
答:域名/IP。获取Internet上主机的地址可以使用InetAddress类的静态方法getByName(String s)将一个域名或IP地址传递给方法的参数s,获得一个InetAddress对象,该对象含有主机地址的域名和IP地址,格式为:域名/IP。
2.一个URL对象通常包含哪些信息。
答:一个URL对象通常包括最基本的三部分信息,即协议、地址、资源。协议必须是URL对象所在java虚拟机支持的协议,常用的java虚拟机支持的协议有HTTP、FTP、File协议。地址必须是能连接的有效IP地址或域名。资源可以是主机上的任何一个文件。
3.客户端的Socket对象和服务器端的Socket对象是怎样通信的。
答:客户端的套接字获得的输入输出流和服务器端的套接字获得的输出输入流互相连接后进行通信。
4.基于UDP通信和基于TCP通信的不同之处。
答:基于UDP的信息传递更快,但不提供可靠性保证。
TCP面向连接(如打电话要先拨号建立连接); UDP是无连接的,即发送数据之前不需要建立连接;
TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付;
UDP具有较好的实时性,工作效率比TCP高,适用于高速传输和实时性较高的通信或广播通信;
每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信;
TCP对系统资源要求较多,UDP对系统资源要求较少。
5.简述Java NIO。
答:NIO也被解释为Non-Blocking IO(非阻塞IO),提供异步IO的操作,适用于多线程程序的网络IO操作,减少多线程服务器的线程开销,提升效率。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。
6.Java NIO的工作原理。
答:由一个专门线程来处理所有的 IO 事件,并负责分发;事件驱动机制:事件到的时候触发,而不是同步的去监视事件;线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次切换都是有意义的。减少无谓线程切换。
7.ServerSocket对象调用accept()方法返回一个什么类型的对象。
答:ServerSocket对象调用accept()方法返回一个和客户端Socket对象相连的Socket对象。accept()方法会堵塞线程的继续执行,直到接收到客户的呼叫。
8.URL对象调用哪个方法可以返回一个指向该URL对象所包含的资源的输入流。
答:URL对象调用InputStream openStream()方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源信息读入到客户端。
JDBC与MySQL数据库
1.JDBC是什么。
答:JDBC是java提供的专门用于操作数据库的API,它操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库。程序经常使用JDBC进行如下操作:
与一个数据库建立连接;向已连接的数据库发送SQL语句;处理SQL语句返回的结果。
2.Connection、Statement、ResultSet、PreparedStatement类各自的作用。
答:
Connection类:连接数据库;
Statement类:声明、发送、处理SOL语句;
ResultSet类:存放SQL语句查询结果的结果集;
PreparedStatement类:是用来执行SQL查询语句的API之一,封装预处理后的SQL语句,即封装数据库底层的内部命令。
3.什么是事务,事务处理的步骤。
答:事务由一组SQL语句组成,所谓事务处理是指:应用程序保证事务中的SQL语句要么全部都执行,要么一个都不执行。
事务处理的步骤:
用setAutoCommit(booean b)方法关闭自动提交模式;用commit()方法处理事务;用rollback()方法处理事务失败。
4.预处理语句的好处。
答:(如果应用程序能针对连接的数据库,事先就将SQL语句解释为数据库底层的内部命令,然后直接让数据库去执行这个命令,显然不仅减轻了数据库的负担,而且也提高了访问数据库的速度。)
Connection和某个数据库建立了连接对象con,那么con就可以调用prepareStatement(String sql)方法对参数sql指定的SQL语句进行预编译处理,生成该数据库底层的内部命令,并将该命令封装在PreparedStatement对象中,那么该对象调用相应的方法都可以使得该底层内部命令被数据库执行。这样不仅减轻了数据库的负担,而且也提高了访问数据库的速度。
5.PreparedStatement和Statement类的区别。
答:Statement 用于通用查询,PreparedStatement 用于执行参数化查询。
使用PreparedStatement 对象进行SQL查询:数据库系统会对sql语句进行预编译处理,预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象的查询速度更快。
使用 Statement 对象:在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。



