sleep()的作用是让线程放弃当前剩余的时间片,线程将转入阻塞状态,在睡眠时间过后线程会进入就绪状态,在大于等于睡眠时间后会进入运行状态。
yield()的作用是让线程放弃当前剩余的时间片,线程将进入就绪状态,并将处理机给大于等于其优先级的线程运行。yield()过后可能是就绪状态,也可能继续获得处理机运行。
在Java中只有一种字符存在,那就是 Unicode (不选择任何特定编码,直接使用他们在字符集中的编号,这是统一的唯一方法)。
这是为了让多种编码方式共存,又不产生混乱。
当JVM和文件系统进行交互时,如果是字节流,那么二进制文本不需要改变。
如果是字符流,在输出时,将会隐式的将字符流中的Unicode按照系统默认的编码方式进行编码,输入时,将会隐式的按照系统默认的编码集进行解码。
Java gc是对无引用的对象的回收,回收的是对象占据的内存空间而不是对象本身。
对象由其引用和内存空间构成。当对象没有引用时,其内存空间就会被回收,对象也被销毁。
gc主要是对堆进行垃圾回收,gc对于新生代和老年代有不同的垃圾回收策略。栈中不存在垃圾回收。
start()方法使线程进入就绪状态。
notify()随机唤醒一个等待状态的线程。
Java对于线程状态的官方解释:
public static native void sleep(long millis) throws InterruptedException;
同一个线程不能调用两次start()方法,否则会抛出非法线程状态异常IllegalThreadStateException。
这是因为第一次执行start()方法后,线程进入就绪(可运行,Runnable)状态。这种状态下不能再次调用start()方法。
底部原理是线程有一个threadStatus属性,存储线程的状态。当线程刚被创建时,threadStatus的值是0,当调用start()时,threadStatus的值会被修改为随机的正数。只有threadStatus为0时才可以执行start()方法,否则抛出ThreadStateException。而线程
线程死亡后,会将threadStatus设置为null,此时再调用,会抛出空指针异常。
对线程对象直接调用run()方法,相当于执行普通成员方法,不会抛出异常。
如果调用wait()方法的对象不属于当前的线程,那么它不会使当前线程进入等待状态。
不是只有锁对象有notify()方法,换言之,notify()方法不限制调用的对象,任何对象都可以调用它。
C的意思是,一个线程因为抢占机制被迫放弃当前时间片,停止运行,但Java线程调度是优先级不同抢占,同级轮换。当线程被抢占,轮换队列中还有其他线程时,会排在后面。
多线程之间如果想要通讯,可以通过管道流来实现
Callable接口是jdk5的新接口,它是一个函数式接口,也是Runnable接口的增强版。
call()方法是线程执行的方法,不仅有了返回类型,还可以自定义抛出异常的类型。
@FunctionalInterface
public interface Callable<V> {
V call() throws Exception;
Future接口也是jdk5的新接口,它有一个实现类FutureTask,实现了Future和Runnable接口,所以可以作为Thread的target建立线程。
一般可以将一个类实现Callable接口,然后构建FutureTask类,构造函数的参数是这个类的对象,最后把FutureTask的对象作为Thread的target,建立线程。
垃圾回收进程在jvm中优先级相当相当低。
相当于3个进程A,B,C争夺虚拟机,优先级相同,所以执行顺序随机。
public static void main(String[] x) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, InterruptedException {
Thread t = new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.print("2");
}
});
t.start();
t.join();
System.out.print("1");
}
启动线程t后,t.join()方法表示,当前线程(主线程)进入waiting状态,等待t线程的运行结束。所以t线程先执行,主线程后执行。
class X extends Thread implements Runnable {
public void run() {
System.out.println("this is run()");
}
public static void main(String args[]) {
Thread t = new Thread(new X());
t.start();
}
}
程序会正常编译和运行
FTP和HTTP都是基于TCP协议的。
FTP使用两个并行的TCP连接来传输文件,一个是控制连接,另一个是数据连接。
(1) public Socket() {...}
(2) public Socket(Proxy proxy) {...}
(3) protected Socket(SocketImpl impl) throws SocketException {...}
(4) private Socket(Void ignore, SocketImpl impl) {...}
(5) public Socket(String host, int port)
throws UnknownHostException, IOException{...}
(6) public Socket(InetAddress address, int port) throws IOException {...}
(7) public Socket(String host, int port, InetAddress localAddr,
int localPort) throws IOException {...}
(8) public Socket(InetAddress address, int port, InetAddress localAddr,
int localPort) throws IOException {...}
(9) public Socket(String host, int port, boolean stream) throws IOException {...}
(10) public Socket(InetAddress host, int port, boolean stream)
throws IOException{...}
常用的Socket创建方式:
无参构造方法
(主机名,端口号)
(InetAddress,端口号)——InetAddress是IP地址类
(String host, int port, InetAddress localAddr, int localPort) —— 创建一个套接字并将其连接到指定远程主机上的指定远程端口。
(主机名,端口号,boolean)——已过时。 使用 DatagramSocket 取代 UDP 传输。
(InetAddress,端口号,boolean)——已过时。 使用 DatagramSocket 取代 UDP 传输。
@WebService注释标记 Java 类;实现 WebService 接口时,标记服务端点接口。
实现 Web Service 的 Java 类必须指定@WebService 或 @WebServiceProvider 注释。不能同时提供这两种注释。
@WebMethod作为一项 Web Service操作的方法。
@Oneway 将一个方法表示为只有输入消息而没有输出消息的Web Service单向操作
@WebParam 定制从单个参数至 WebService 消息部件和 XML 元素的映射。
@WebResult-定义返回值
当客户进程的 Socket构造方法返回成功, 表示客户进程的连接请求被加入到服务器进程的请求连接队列中. 虽然客户端成功返回 Socket对象, 但是还没跟服务器进程形成一条通信线路. 必须在服务器进程通过 ServerSocket 的 accept() 方法从请求连接队列中取出连接请求, 并返回一个Socket 对象后, 服务器进程这个Socket 对象才与客户端的 Socket 对象形成一条通信线路。
也就是说,客户端和服务端真正建立连接,是在ServerSocket使用accept()方法获取Socket后。
一个客户端可以建立多个TCP连接与客户端通信。
表单信息作为参数,存储在报文体也就是请求消息主体中。
Tomcat不支持EJB。
基于GPL协议的是JBOSS
ICMP,也就是Internet Control Message Protocol,网络控制消息协议的缩写,用于控制数据报传送中的差错情况。
TIME_WAIT:通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态
FIN_WAIT_1:fin_wait1状态是在server端主动要求关闭tcp连接,并且主动发送fin以后,等待client端回复ack时候的状态
FIN_WAIT_2:当服务器收到客户端发送的 FIN 包后发送一个 ACK 包以响应客户端的这个 FIN 包。此时服务器的状态变成 CLOSE_WAIT,客户端在收到服务器发送的 ACK 包后自己的状态变为 FIN_WAIT2。
SYN_SENT:SYN_SENT表示请求连接。
交换机的每个端口享有全部的带宽。
网速一般约等于带宽的1/8~1/10,带宽为100Mbps,所以网速为10Mb/s到12.5Mb/s。
1G/12.5Mb/s= 81.92s,即最短时间为82s。
路由器根据IP地址转发,所以是网络层。
socket() -> bind() -> listen() -> accept() -> read()/write() -> close()
首先创建一个套接字,然后调用bind()方法给套接字命名,等待用户连接到这个套接字。
服务端使用listen()来创建一个队列,并将其用于存放来自客户的接入连接,等到accept()成功接收到一个客户端套接字后,可以通过流进行读写。完成读写后,关闭套接字。
public synchronized void close() throws IOException{...}
public DatagramSocket() throws SocketException {... }
抛出SocketException
public URL(String protocol, String host, int port, String file)
throws MalformedURLException{...}
URL格式不对会抛出畸形的URL异常。
getByNames()通过主机名返回IP地址对象
public static InetAddress getByName(String host){...}
getHostName()返回主机名字符串
String getHostName() { return hostName;}
getAddress()返回IP地址对象的byte数组形式
public byte[] getAddress() {}
getLocalHost()返回本地IP地址对象
public static InetAddress getLocalHost() throws UnknownHostException {
ping命令的作用是检查两个主机是否能通信,与端口无关。
想要查看端口的情况,如果是本机端口,使用netstat -an查看所有端口的情况,或者输入netstat -an | grep 目标端口号查看该端口。
如果是远程端口,使用telnet 目标主机 目标端口号命令查看。