问题描述
- 多线程,貌似死锁了,大家帮忙看下
-
我写了个三个类,一个监听服务器类Listener,一个服务请求处理类Handler,一个服务请求类Runner。
想要用Runner发送请求,Listener收到请求后交给Handler处理,Handler再返回一组数据给Runner,
现在Listener收到请求后就执行不下去了,大神们帮忙看下。代码
Listener.javapublic class Listener implements Runnable { private static final int poolSize = Runtime.getRuntime() .availableProcessors(); ExecutorService service; ServerSocket server; public Listener(int port) throws IOException { server = new ServerSocket(port); service = Executors.newFixedThreadPool(poolSize); } public static void main(String[] args) {// 启动监听服务器 try { Thread t = new Thread(new Listener(9528)); t.start(); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { Socket in; while (true) {// 一直等待新请求进来 try { in = server.accept();// 获取请求 System.out.println("有新请求进来"); service.submit(new Handler(in));// 处理请求 } catch (IOException e) { e.printStackTrace(); service.shutdown(); } } } }
Handler.java
public class Handler implements Runnable { private Socket socket; public Handler(Socket in) { this.socket = in; } @Override public void run() { try { BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println(br.readLine()); OutputStream out = socket.getOutputStream(); out.write(new String(System.currentTimeMillis()+"").getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Runner.java
public class Runner { public static void main(String[] args) throws UnknownHostException, IOException { for(int i =0 ;i<10;i++){ Socket s = new Socket(InetAddress.getLocalHost(),9528); BufferedReader reader=new BufferedReader(new InputStreamReader(s.getInputStream())); System.out.println(reader.readLine()); OutputStream out=s.getOutputStream(); out.write(new String("request"+i).getBytes()); out.flush(); } } }
解决方案
in = server.accept();
这是阻塞的,如果没有连接上,它会一直卡在这里。
而且你整个流程都不对
解决方案二:
刚才测试了一下,是service.submit(new Handler(in));这句话好像没有开启线程,没有运行handler中的run函数,导致server.accept()一直等待
时间: 2024-08-22 14:32:14