1、(唯品会笔试题)编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
public class ThreeThread { public static void main (String[] args) throws Exception { Object A = new Object (); Object B = new Object (); Object C = new Object (); Thread t1 = new Thread (new Print(A, B), "A"); Thread t2 = new Thread (new Print(B, C), "B"); Thread t3 = new Thread (new Print(C, A), "C"); // 为了让线程依次启动 所以在Main函数所在的线程 添加了一个sleep(1) t1.start(); Thread.sleep(1); t2.start(); Thread.sleep(1); t3.start(); } } class Print implements Runnable { private Object self; private Object next; public Print (Object self, Object next) throws InterruptedException { this.self = self; this.next = next; } public void run () { for (int i = 0; i < 10; i++) { synchronized (self) { synchronized (next) { System.out.print (Thread.currentThread().getName()); next.notify(); } try { if (i == 9) { return; // 当i == 9 即最后一次循环, 将直接退出 不再进行等待 } self.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
2、(唯品会笔试题)简述TCP三次握手命令。(这里补充简述除了连接外的断开情况。)
A向B发出请求,主动打开连接,B被动打开连接。
1)A向B发出连接请求报文段,这时首部中的同部位SYN=1,同时选择一个初始序列号seq=x;
2)B收到哦连接请求报文段后,如同意建立连接,则向A发出确认,在报文段中把SYN和ACK都置为1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y;
3)A收到B的确认后,再向B发出确认。将报文段中的ACK置为1,确认号ack=y+1,而自己的序号为seq=x+1.
A向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。
1)A把释放报文段首部的终止控制位FIN置为1,序号seq=u;
2)B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,这时B进入关闭等待状态。A接收到B发的确认后,进入终止等待2状态;
3)若B已经没有要向A发出的数据,则B发出连接数据报文,将FIN置为1,ACK=1,B的序号为seq=w。确认号为ack=u+1;
4)A收到B的连接释放报文后,发出确认,置ACK为1,自己的序号为seq=u+1,确认号ack=u+1.
3、简述GoF设计模式
1)创建型模式
简单工厂模式(Simple Factory);
工厂方法模式(Factory Method);
抽象工厂模式(Abstract Factory);
创建者模式(Builder);
原型模式(Prototype);
单例模式(Singleton)。
2)结构型模式
外观模式(Facade);
适配器模式(Adapter);
代理模式(Proxy);
装饰模式(Decorator);
桥模式(Bridge);
组合模式(Composite);
享元模式(Flyweight)。
3)行为型模式
模板方法模式(Template Method);
观察者模式(Observer);
状态模式(State);
策略模式(Strategy);
职责链模式(Chain of Responsibility);
命令模式(Command);
访问者模式(Visitor);
调停者模式(Mediator);
备忘录模式(Memento);
迭代器模式(Iterator);
解释器模式(Interpreter)。
4、在一冒险游戏里,你见到一个宝箱,身上有N把钥匙,其中一把可以打开宝箱,假如没有任何提示,随机尝试,问:
(1)恰好第K次(1=<K<=N)打开宝箱的概率是多少。
(1-1/n)*(1-1/(n-1))*(1-1/(n-2))***(1/(n-k+1)) = 1/n
(2)平均需要尝试多少次。
这个就是求期望值 由于每次打开宝箱的概率都是1/n,则期望值为: 1*(1/n)+2*(1/n)+3*(1/n)+......+n*(1/n) = (n+1)/2