1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

匿名 (未验证) 提交于 2019-12-02 21:53:52

. 进程和线程之间有什么不同?

(self contained)Java

2. 多线程编程的好处是什么?

CPU

3. 用户线程和守护线程有什么区别?

JavaJVMJVM

4. 我们如何创建一个线程?

RunnableThreadThreadThread,run

线程生命周期?

① 新建状态(New Thread)Java语言中使用new 操作符创建一个线程后,该线程仅仅是一个空对象,它具备类线程的一些特征,但此时系统没有为其分配资源,这时的线程处于创建状态。

Thread类的方法来设置各种属性,

② 就绪状态(Runnable)start()方法启动一个线程后,系统为该线程分配所需资源,使该线程处于就绪状态。

③ 运行状态(Running)Java运行系统通过调度选中一个处于就绪状态的线程,使其占有CPU并转为运行状态。此时,系统真正执行线程的run()方法。

④ 阻塞和唤醒线程

(Blocked):一个正在运行的线程因某些原因不能继续运行时,就进入阻塞 状态。这些原因包括:

⑤ 死亡状态(Dead)run()方法执行结束后进入死亡状态。此外,如果线程执行了interrupt()或stop()方法,那么它也会以异常退出的方式进入死亡状态。

终止线程的三种方法

① 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止,推荐使用。

② 使用stop方法强制终止线程(这个方法不推荐使用,因为stop和suppend、resume一样,也可能发生不可预料的结果)。

③ 使用interrupt方法中断线程。

6. 可以直接调用Thread类的run()方法么?

Threadrun()Thread.start()

7. 如何让正在运行的线程暂停一段时间?

3******sleep()方法和Object类中的wait()方法的区别



,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题
java.lang.Thread类中,提供了sleep(),

sleep()可以将一个线程睡眠,参数可以指定一个时间。
wait()可以将一个线程挂起,直到超时或者该线程被唤醒。
wait有两种形式wait()和wait(milliseconds).
sleep和wait的区别有:
1,这两个方法来自不同的类分别是Thread和Object
2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

8. 你对线程优先级的理解是什么?

(OS dependent)int(1-10)110

12.线程之间是如何通信的?

Object绫讳腑wait()\notify()\notifyAll()wait, notifynotifyAll.

14. 为什么wait(), notify()和notifyAll()必须在同步方法或者同步块中被调用?

wait()notify()notify()

18. 同步方法和同步块,哪个是更好的选择?

20. 什么是ThreadLocal?

ThreadLocalThreadLocal

Threadget()\set()ThreadLocalprivate staticThreadLocalThreadLocal

23. 什么是死锁(Deadlock)?如何分析和避免死锁?

JavaBLOCKEDidid

Java线程池?

Java并发面试问题

1. 什么是原子操作?在Java Concurrency API中有哪些原子类(atomic classes)?

线程调度

协同式

Java

(Java)

4. 字符流与字节流的区别

  • Unicode
  • UnicodeUnicode

1.javajdk

inputStreamOutputStream,InputSteamReaderOutputStreamWriterjava.io

java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提供了这种支持,我们可以调用OutputStreamwriteObjectserializablejavacwriteObject

web开发中,如果对象被保存在了SessiontomcatSessionSerializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。

3.,


InputStream
OutputStream

7.,,为什么

8.,,为什么

11.,


New OutputStreamWriternew FileOutputStreamFile file;

13.,

ObjectInputStream ObjectOutputStream

14.



serializable

transient

15.,?

transient

19.,,

close
finally

20.Java,,






io

Icon

InputStream,OutputStream,
FileInputStream,FileOutputStream,
BufferedInputStream,BufferedOutputStream
Reader,Writer
BufferedReader,BufferedWriter


21 Stream

Icon


22 io

Icon

File对象获取文件路径,通过字符流Reader加入文件,使用字符缓存流BufferedReader处理Reader,再定义一个字符串,循环遍历出文件。代码如下:
new
try
new
bufferednew
null;
while((data = buffered.readLine())!=null){
System.out.println(data);
}
catch
e.printStackTrace();
catch
e.printStackTrace();
}


23 io

Icon

Io流主要是用来处理输入输出问题,常用的io流有InputStream,OutputStream,Reader,Writer等


24 JAVAIOreadLine

Icon

Java的io流用来处理输入输出问题,readLine是BufferedReader里的一个方法,用来读取一行。


25

Icon

ObjectInputStream,需要实现Serializable接口


28 javajava

Icon

Serializable接口

3****反射

3

jdbcClass.forName(‘com.MySQL.jdbc.Driver.class‘).newInstance();

hibernatestruts

4

java

2.3 Java反射应用场合
Java程序中许多对象在运行时都会出现两种类型:编译时类型运行时类型
编译时的类型由声明该对象时使用的类型决定,运行时的类型由实际赋给对象的类型决定
Person p =new Student();
Person,而运行时为Student

Object,但程序又需要调用该对象运行时类型的方法。为了这些问题程序需要在运行时发现对象和类的真实信息。然而,如果编译时根本无法预知该对象和类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息,此时就必须使用反射

4*****XML

XML

XMLExtensible Markup languageXMLDTDXML SchemaXMLXML

2DTDXML Schema

DTDXML SchemaDTDXMLXML SchemaxmlXMLXMLXML SchemaDTDDocument Type definitionXML

,

,xml

.xml5.xml

,xmlWML,WML,internet

XMLHTML?1.xml,,HTML,

,

HTMLa.

,b.c.

,html

html

?

xmlapi

dtd

dtd

xslt

XML和json的优缺点
xml的优点
1)格式统一
2)容易与其他系统进行远程交互,数据共享比较方便
xml的缺点
1)xml文件庞大,文件格式复杂,传输占带宽
2)服务器和客户端都需要花费大量代码来解析xml,导致服务器和客户端代码变得异常复杂且不易维护
3)客户端和服务端解析xml花费较多的资源和时间
json的优点
1)数据格式比较简单,易于读写,格式是压缩的,占用带宽小
2)易于解析,包括JavaScript可以通过简单的通过eval_r()进行json数据的读取
json的缺点
1)没有xml那么通用
2)json格式目前还在推广阶段

<1>.XML
A.
B.
<2>.XML
A.XML
B.XML
C.XML
D.XML

(2).JSON
<1>.JSON
A.
B.JavaScripteval_r()JSON
C.ActionScript, C, C#, ColdFusion, Java, javascript, Perl, PHP, Python, Ruby
D.phpPHP-JSONJSON-PHPPHPPHPJSON
E.JSON
<2>.JSON
A.XMLXML
B.JSONWeb Service

3xml

:XMLXMLXML

XMLXML

XMLjavaDOM SAX

6****JDBC

JavaJDBC

1Class.forName()

2DriverManager.getConnection()

3SQLPreparedStatementconn.prepareStatement()

4SQLSQLsetXXX()

5

JDBCJavaJDBC

JDBC APIJavaJavaJDBCJDBCJDBCClass.forName

JavaJDBC

JDBCJavaJDBC

JDBCSocket

JDBC

A. Class.forName()DriverManagerB. DriverManagerDriverManager.getConnnection()URL

StatementPreparedStatement

Statement

  • PreparedStatementSQL
  • PreparedStatement
  • PreparedStatement
  • PreparedStatementsetterStatement

JDBC

  • Connection, Statement, ResultSetJDBCclose
  • ResultSetStatementConnectionResultSetStatement
  • finally
  • PreparedStatementStatementSQL
  • ResultSetfetchSize
  • WEBJNDIJDBC
  • ResultSetRowSet

JDBC的DataSource是什么,有什么好处?

DataSourcejavax.sqlDriverManager

  • PreparedStatement
  • ResultSet
  • JNDIservlet

7*****泛型

1. Java ? 使用泛型的好处是什么?

Java泛型面试Java1.4或更早版本的开发背景的人 都知道,在集合中存储对象并在使用前进行类型转换是多么的不方便。泛型防止了那种情况的发生。它提供了编译期的类型安全,确保你只能把正确类型的对象放入 集合中,避免了在运行时出现ClassCastException

?

Java泛型面试题。限定通配符对类型进行了限制。有两种限定通配符,一种是<? extends T>它通过确保类型必须是T的子类来设定类型的上界,另一种是<? super T>它通过确保类型必须是T的父类来设定类型的下界。泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。另一方面<?>表 示了非限定通配符,因为<?>可以用任意类型来替代。更多信息请参阅我的文章泛型中限定通配符和非限定通配符之间的区别。

JavaObject类型处理。当程序从集合中取出对象之后,就要进行强制类型转换,这种强制类型转换不仅代码臃肿还容易引起ClassCastException异常。

JDK1.5之后,Java引用了

8*****Socket

TCP/IPIPIPInternet

TCPtcpUDPIP

/C/S

TCPUDP

TCPTranfer Control ProtocolTCPsocketTCPsocketserver socketsocketsocket

UDPUser Datagram Protocol

UDP1

UDP64KB

UDP

TCP1socketTCP

TCPsocket

TCP

1TCPTelnetFTPTCPUDP

2UDPclient/serverUDP

Socketjava

1Socket

SocketSocketSocketTCP/IPSocketIP

SocketTCP/IPJavaSocketTCP/IP

2Socket

ServerListen()ClientConnect()ServerClientAcceptServerSendWrite

Socket

1Socket

2Socket/

3Socket/

4Socket.close

1Socket

//new出一个对象即可//指定链接的IP地址,端口号

  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

2Socket

//新建Socket服务,将数据发送给服务端

{

}

System.out.println(sb.toString());

3、Socket
4

1socket.close();
2InputStream.close();

1
2Socket

4Socket.connect();

4、5、网络的超时

setSOTimeout(time);
ps:SO是Socket的缩写

5、5、网络的超时

setSOTimeout(time);
ps:SO是Socket的缩写

6、5、网络的超时

setSOTimeout(time);
ps:SO是Socket的缩写

8.网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?

:

1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。

2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。两者都可以提高程序的并发度,提高程序运行效率和响应时间。

SMP机器上运行,而进程则可以跨机器迁移。

:

(address space),线程则共享地址空间。所有其它区别都是由此而来的:

1。速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。

2。资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。

3。同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内

.

1.java

javaThreadRunablejava main

2.:

多个线程访问同一个资源,导致结果和期望值不同,我们就说它是非线程安全的(线程不安全),反之我们就说它是线程安全的。

了解:

a.多个线程访问同一个资源(这里的资源通常指的是全局变量或者静态变量),如果每次运行结果和单线程运行的结果是一样的,就是线程安

b.线程安全问题都是由全局变量及静态变量引起的。

c.若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;

3.

1(New)

2(Runnable)start()CPU

3(Running)CPU

4(Blocked)CPU

  ()wait()JVM

  ()JVM

  ()sleep()join()I/OJVMsleep()join()I/O

5(Dead)run()

了解:

1、线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但不管怎样,当我们new了这个对象后,线程就进入了初始

2、当该对象调用了start()方法,就进入可运行状态;

3、进入可运行状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态;

4、进入运行状态后情况就比较复杂了

4.1、run()方法或main()方法结束后,线程就进入终止状态;

4.2、当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资

源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片;

4.3、线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接

4.4、当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchronized(同步),获取不到锁标记,将会立即进入锁

得锁标记后,就转入可运行状态,等待OS分配CPU时间片;

4.5、当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自

动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的

是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后

补充:(waitsleep)

waitsleepwaitnotifynotifyAllnotifynotifyAllsleep

4.:

a.synchronized

1.synchronized

2.synchronized ()

b.

c.使用ThreadLocal(参考:http://blog.csdn.net/drifterj/article/details/7782706)

1. 为多线程并发的互斥控制提供了另一种全新的解决思路

2. 通过ThreadLocal为其他模块的API传递参数

5.java (可参考:http://www.oschina.net/question/565065_86540)

1.减少了创建和销毁线程的次数,

2.可以根据系统的承受能力,

(每个线程需要大约1MB内存,线程开的越多,

消耗的内存也就越大,最后宕机)。

通常我们使用的线程池是实现了ExecutorService的ThreadPoolExecutor。

6.死锁

死锁是因为多线程访问共享资源,由于访问的顺序不当所造成的,通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程

中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等

死锁产生的原因:是由访问共享资源顺序不当所造成的.

简单的说:所谓死锁,是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

7.守护线程

在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)

用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:

只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM

Daemon GC (垃圾回收器),它就是一个很称职的守护者。

User和Daemon User Thread已经全部退出运行了,只剩下Daemon

Thread Daemon也就没有工作可做了,也就没有继续运行程序的必要了。

原文:https://www.cnblogs.com/shan1393/p/9251933.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!