2 qqq778899123 qqq778899123 于 2016.02.19 09:11 提问

多线程,貌似死锁了,大家帮忙看下

我写了个三个类,一个监听服务器类Listener,一个服务请求处理类Handler,一个服务请求类Runner。
想要用Runner发送请求,Listener收到请求后交给Handler处理,Handler再返回一组数据给Runner,
现在Listener收到请求后就执行不下去了,大神们帮忙看下。

代码
Listener.java

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


2个回答

caozhy
caozhy   Ds   Rxr 2016.02.19 09:20

in = server.accept();
这是阻塞的,如果没有连接上,它会一直卡在这里。

而且你整个流程都不对

qqq778899123
qqq778899123 哪个地方的流程写错了
2 年多之前 回复
chen956
chen956   2016.02.19 09:42

刚才测试了一下,是service.submit(new Handler(in));这句话好像没有开启线程,没有运行handler中的run函数,导致server.accept()一直等待

qqq778899123
qqq778899123 是有开启的,我把Runner第7、8、9句(OutputStr……开始)注释掉,Handler的run方法中第1、2句(BufferedReader..开始,)注释,程序就可以运行了
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
多线程死锁以及解决方法
解决死锁没有简单的方法,这是因为线程产生死锁都各有各的原因,而且往往具有很高的负载。大多数软件测试产生不了足够多的负载,所以不可能暴露所有的线程错误。在这里中,下面将讨论开发过程常见的4类典型的死锁和解决对策。 (1)数据库死锁    在数据库中,如果一个连接占用了另一个连接所需的数据库锁,则它可以阻塞另一个连接。如果两个或两个以上的连接相互阻塞,则它们都不能继续执行,这 种情况称为数
多线程死锁及解决办法
死锁是由于不同线程按照不同顺序进行加锁而造成的。如: 线程A:对lock a加锁 => 对lock b加锁 => dosth => 释放lock b => 释放lock a 线程B:对lock b加锁 => 对lock a加锁 => dosth => 释放lock a => 释放lock b 这样两条线程,就可能发生死锁问题。要避免发生死锁,应该使用同一个顺序进行加锁。
(十四)java多线程之死锁
本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.com/kco1989/kco 代码已经全部托管github有需要的同学自行下载 引言多线程如果设计的不合理的话,很可能就会出现死锁.当两个或者多个线程同事想要去获取共享资源的锁时,但每个线程都要等其他线
Java多线程-死锁的出现和解决
Java多线程-死锁什么是死锁?死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不能正常运行.形象的说就是:一个宝藏需要两把钥匙来打开,同时间正好来了两个人,他们一人一把钥匙,但是双方都再等着对方能交出钥匙来打开宝藏,谁都没释放自己的那把钥匙.就这样这俩人一直僵持下去,直到开发人员发现这个局面.导致死锁的根源在于不适当地运用“syn
多线程的五种常见死锁问题 (看看你能答对几个)
多线程的死锁问题(五个常见实例教你完全理解死锁问题) 环境信息: Mac OS X 10.10.5 Xcode 6.2 iOS 8.2 死锁一直都是在使用多线程时,需要注意的一个问题,并且有时候会造成难以估量的损失,NASA的登月机器人就曾因为优先级反转导致主线程阻塞死锁计算机频繁重启,损失几亿美金。以前对同步、异步,串行、并行只有一个模糊的概念,想想也是
多线程——死锁产生的条件和过程分析
package com.qianfeng.demo02; /** * 出现死锁的四个必要条件: * 1.互斥条件:资源不能互相共享,各用各的。 * 2.请求与保持条件:已经得到了资源的线程,还想要申请新的资源。 * 3.非剥夺条件:已经分配的资源不能在相应的线程中强行的剥夺。 * 4.循环等待条件:系统中若干个线程组成了环路,该环路中每一个线程都在等待着相邻的线程占据的资源。 *
C++问题代码
自己编的代码,存在严重内存泄露,请大家帮忙看下!
SQL server应用程序
大家帮忙看下Mysql 应用 程序看能不能用
Java多线程产生死锁的条件以及解决方法
摘自《Thinking in Java》: 死锁产生的原因: 1.互斥条件。任务使用的资源至少一个是不能共享的。 2.至少有一个任务它必须持有一个资源且正在等待获取一个当前被别的任务持有的资源。 3.资源不能被任务抢占。任务必须把资源释放当做普通事件。 4.必须有等待循环。 要发生死锁,上述条件必须全部都满足;所以要防止死锁的话,只需要破坏其中的一个即可。在程序中,最容易防止死锁的方法
多线程死锁的产生和解决
什么是死锁线程死锁一般是发生在多个线程的多个锁之间,比如线程A拥有临界区对象LockA的所有权,等待临界区对象LockB;线程B拥有临界区对象LockB的所有权,等待临界区对象LockA;由于两个线程间相互等待各自的锁,并且不释放,就会导致程序一直等待下去,发生死锁;死锁伪代码//线程A EnterCriticalSection(&g_csLockA); Sleep(10); EnterCritic