20Java进阶练习题整理(2)

阅读目录

    • 1.线程
    • 2.线程代码题
    • 3.Java net
    • 4.Junit测试

1.线程

20Java进阶练习题整理(2)_第1张图片
20Java进阶练习题整理(2)_第2张图片
20Java进阶练习题整理(2)_第3张图片
20Java进阶练习题整理(2)_第4张图片
sleep()的作用是让线程放弃当前剩余的时间片,线程将转入阻塞状态,在睡眠时间过后线程会进入就绪状态,在大于等于睡眠时间后会进入运行状态。
yield()的作用是让线程放弃当前剩余的时间片,线程将进入就绪状态,并将处理机给大于等于其优先级的线程运行。yield()过后可能是就绪状态,也可能继续获得处理机运行。
20Java进阶练习题整理(2)_第5张图片
在Java中只有一种字符存在,那就是 Unicode (不选择任何特定编码,直接使用他们在字符集中的编号,这是统一的唯一方法)。
这是为了让多种编码方式共存,又不产生混乱。
当JVM和文件系统进行交互时,如果是字节流,那么二进制文本不需要改变。
如果是字符流,在输出时,将会隐式的将字符流中的Unicode按照系统默认的编码方式进行编码,输入时,将会隐式的按照系统默认的编码集进行解码。
20Java进阶练习题整理(2)_第6张图片
Java gc是对无引用的对象的回收,回收的是对象占据的内存空间而不是对象本身。
对象由其引用和内存空间构成。当对象没有引用时,其内存空间就会被回收,对象也被销毁。
gc主要是对堆进行垃圾回收,gc对于新生代和老年代有不同的垃圾回收策略。栈中不存在垃圾回收。
20Java进阶练习题整理(2)_第7张图片
start()方法使线程进入就绪状态。
notify()随机唤醒一个等待状态的线程。
Java对于线程状态的官方解释:

  • BLOCKED:阻塞
    • A thread that is blocked waiting for a monitor lock is in this state.线程等待临界区的锁
  • WAITING 等待
    • A thread that is waiting indefinitely for another thread to perform a particular action is in this state.线程等待其他线程实施一个指定动作。
  • NEW 新建
    • A thread that has not yet started is in this state.线程刚被创建出来,还没被执行start()方法
  • RUNNABLE 运行
    • A thread executing in the Java virtual machine is in this state.线程在JVM中执行。
  • TIMED_WAITING 指定时间的等待
    • A thread that is waiting for another thread to perform an action, for up to a specified waiting time is in this state.线程等待其他线程实施一个指定动作,或者时间到达指定时间。
  • TERMINATED 终止
    • A thread that has exited is in this state.线程退出
      sleep()是线程类的方法,不会释放对象锁。
      wait()是Object类的方法,会让本线程放弃对象锁,线程进入等待锁定池,只有当notify()唤醒本线程后,本线程才会进入对象锁定池,准备获得对象锁并进入运行状态。
      静态方法Thread.sleep()会抛出InterruptedException。
    public static native void sleep(long millis) throws InterruptedException;

20Java进阶练习题整理(2)_第8张图片
同一个线程不能调用两次start()方法,否则会抛出非法线程状态异常IllegalThreadStateException。
这是因为第一次执行start()方法后,线程进入就绪(可运行,Runnable)状态。这种状态下不能再次调用start()方法。
底部原理是线程有一个threadStatus属性,存储线程的状态。当线程刚被创建时,threadStatus的值是0,当调用start()时,threadStatus的值会被修改为随机的正数。只有threadStatus为0时才可以执行start()方法,否则抛出ThreadStateException。而线程
线程死亡后,会将threadStatus设置为null,此时再调用,会抛出空指针异常。
对线程对象直接调用run()方法,相当于执行普通成员方法,不会抛出异常。

20Java进阶练习题整理(2)_第9张图片
如果调用wait()方法的对象不属于当前的线程,那么它不会使当前线程进入等待状态。
不是只有锁对象有notify()方法,换言之,notify()方法不限制调用的对象,任何对象都可以调用它。

20Java进阶练习题整理(2)_第10张图片
按题意应该选D

20Java进阶练习题整理(2)_第11张图片
C的意思是,一个线程因为抢占机制被迫放弃当前时间片,停止运行,但Java线程调度是优先级不同抢占,同级轮换。当线程被抢占,轮换队列中还有其他线程时,会排在后面。

20Java进阶练习题整理(2)_第12张图片多线程之间如果想要通讯,可以通过管道流来实现
20Java进阶练习题整理(2)_第13张图片
20Java进阶练习题整理(2)_第14张图片
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,建立线程。
20Java进阶练习题整理(2)_第15张图片
20Java进阶练习题整理(2)_第16张图片垃圾回收进程在jvm中优先级相当相当低。

20Java进阶练习题整理(2)_第17张图片
相当于3个进程A,B,C争夺虚拟机,优先级相同,所以执行顺序随机。

2.线程代码题

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();
    }
}

程序会正常编译和运行

3.Java net

20Java进阶练习题整理(2)_第18张图片
FTP和HTTP都是基于TCP协议的。
FTP使用两个并行的TCP连接来传输文件,一个是控制连接,另一个是数据连接。
20Java进阶练习题整理(2)_第19张图片

 (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 传输。

20Java进阶练习题整理(2)_第20张图片
@WebService注释标记 Java ;实现 WebService 接口时,标记服务端点接口
实现 Web Service 的 Java 类必须指定@WebService 或 @WebServiceProvider 注释。不能同时提供这两种注释。
@WebMethod作为一项 Web Service操作的方法
@Oneway 将一个方法表示为只有输入消息而没有输出消息的Web Service单向操作
@WebParam 定制从单个参数至 WebService 消息部件和 XML 元素的映射。
@WebResult-定义返回值

20Java进阶练习题整理(2)_第21张图片
当客户进程的 Socket构造方法返回成功, 表示客户进程的连接请求被加入到服务器进程的请求连接队列中. 虽然客户端成功返回 Socket对象, 但是还没跟服务器进程形成一条通信线路. 必须在服务器进程通过 ServerSocket 的 accept() 方法从请求连接队列中取出连接请求, 并返回一个Socket 对象后, 服务器进程这个Socket 对象才与客户端的 Socket 对象形成一条通信线路。

也就是说,客户端和服务端真正建立连接,是在ServerSocket使用accept()方法获取Socket后。
一个客户端可以建立多个TCP连接与客户端通信。

20Java进阶练习题整理(2)_第22张图片
20Java进阶练习题整理(2)_第23张图片
20Java进阶练习题整理(2)_第24张图片
表单信息作为参数,存储在报文体也就是请求消息主体中。
20Java进阶练习题整理(2)_第25张图片
Tomcat不支持EJB。
基于GPL协议的是JBOSS
ICMP,也就是Internet Control Message Protocol,网络控制消息协议的缩写,用于控制数据报传送中的差错情况。

20Java进阶练习题整理(2)_第26张图片
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表示请求连接。

20Java进阶练习题整理(2)_第27张图片
交换机的每个端口享有全部的带宽。
网速一般约等于带宽的1/8~1/10,带宽为100Mbps,所以网速为10Mb/s到12.5Mb/s。
1G/12.5Mb/s= 81.92s,即最短时间为82s。

20Java进阶练习题整理(2)_第28张图片
路由器根据IP地址转发,所以是网络层。
20Java进阶练习题整理(2)_第29张图片
socket() -> bind() -> listen() -> accept() -> read()/write() -> close() 
首先创建一个套接字,然后调用bind()方法给套接字命名,等待用户连接到这个套接字。
服务端使用listen()来创建一个队列,并将其用于存放来自客户的接入连接,等到accept()成功接收到一个客户端套接字后,可以通过流进行读写。完成读写后,关闭套接字。

20Java进阶练习题整理(2)_第30张图片

 public synchronized void close() throws IOException{...}

20Java进阶练习题整理(2)_第31张图片

 public DatagramSocket() throws SocketException {... }

抛出SocketException

20Java进阶练习题整理(2)_第32张图片

 public URL(String protocol, String host, int port, String file)
 	throws MalformedURLException{...}

URL格式不对会抛出畸形的URL异常。

20Java进阶练习题整理(2)_第33张图片
20Java进阶练习题整理(2)_第34张图片

 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 {

20Java进阶练习题整理(2)_第35张图片
ping命令的作用是检查两个主机是否能通信,与端口无关。
想要查看端口的情况,如果是本机端口,使用netstat -an查看所有端口的情况,或者输入netstat -an | grep 目标端口号查看该端口。
如果是远程端口,使用telnet 目标主机 目标端口号命令查看。

4.Junit测试

20Java进阶练习题整理(2)_第36张图片
程序员编码之后,代码已经通过编译后进行单元测试。
测试前期,还要撰写单元测试计划,编写单元测试用例。

你可能感兴趣的:(Java进阶,java,socket,多线程,网络,单元测试)