java 多线程经常卡死的问题。

龙上 发布于 2014/09/24 00:05
阅读 4K+
收藏 0

public class b{
    public Long a(Long next_time){}
    public Long b(Long next_time){}
    public Long c(Long next_time){}
    public Long d(Long next_time){}
}




上面的B类中的a,b,c,d4个方法通过多线程方式同时执行。

public class test implements Runnable {

    public void run()
    {
        String method = Thread.currentThread().getName();
        Long next_time = 30000L;
        if(method.equals("a"))
        {
            while (true)
            {
                try
                {
                    lottery b = new b();
                    next_time = b.a();
                    Thread.sleep(next_time);  
                } catch (Exception e)
                {
                    
                }
               
            }
        } else if(method.equals("b"))
        {
            while (true)
            {
                try{
                    
                    lottery b = new b();
                    next_time = b.b();
                    Thread.sleep(next_time);
                } catch (Exception e)
                {
    
                }
            }
        }else if(method.equals("c"))
        {
            while (true)
            {
                try
                {
                    lottery b = new b();
                    next_time = b.c();
                    Thread.sleep(next_time);
                } catch (Exception e)
                {

                }
            }
        }else if(method.equals("d"))
        {
            while (true)
            {
                try
                {
                    lottery b = new b();
                    next_time = b.d();
                    Thread.sleep(next_time);
                } catch (Exception e)
                {
    
                }
            }
        }
    }
    public static void main(String[] args) {
        new Thread(new Main(),"a").start();
        new Thread(new Main(),"b").start();
        new Thread(new Main(),"c").start();
        new Thread(new Main(),"d").start();
    }
}



面的代码比较简单。就是并发无限执行b类里面的4个方法。通过数据库日志发现经常执行B类里面的某一个方法到某一行代码以后就不会往下面执行代码了。要通过重启jar才可以。要怎么改代码一直无限执行?
加载中
0
独孤小败
独孤小败
从上面代码里好像看不出来为什么原因死锁,是不是B类里面调用到相同的资源了?能贴出 B 类否
0
h
hao5ang
会不会是因为next_time返回的时间太长了,导致sleep太长,看起来像卡死.输出next_time值看下.
0
星爷
星爷
代码混乱  把代码抽象一下  立马就没事了。
0
NealFeng
NealFeng
4个线程里共用了next_time这个变量,会不会是有b类里的函数把这个值改的太大,导致sleep时间太长。
0
young7
young7

神一般的代码,目测学生党

无法往下执行原因要不死锁了要不sleep时间过长,但是楼主神一般的代码里面连个synchronized关键字都找不到,你叫人怎么帮你分析?如果是死锁了,你开个jconsle不就马上看到哪个线程出问题了么


young7
young7
回复 @龙上 : 还是那句话,开个jconsole,马上看出执行不下去的线程是什么状态,是blocked还是啥的,根据你后来贴出来的代码,猜测就是blocked住了,此时你看下这个被blocked线程是在等待哪个资源,就知道原因了。但目前来看似乎也有可能没有死锁,是因为调用数据库某个方法时候阻塞了,没有具体代码无法分析
龙上
龙上
只要并发执行,数据不需要同步
0
我要成为一代技术大亨
我要成为一代技术大亨
把sleep的睡眠时间加上一个上限控制,还有,既然是分开执行多个方法,建议多写几个类,每个类处理一个方法,这些方法中如果有共享资源,请用同步机制控制一下。
0
飘逸的逸
飘逸的逸
争用资源导致死锁?把都用到的资源synchronized试试
0
宅男小何
宅男小何
是不是有异常,有时候线程里面的异常log不打印出来,在最外层搞一个try catch试试
龙上
龙上
恩.我主要是搞PHP的.我是想不论出现如何异常,都要往下执行.但是程序最终还是被卡住了.
宅男小何
宅男小何
回复 @龙上 : 在while里面用try catch?大忌啊,初学者吧
龙上
龙上
没有异常的.全部都使用了try catch捕捉了.出现异常以后都重置了next_time的时间
0
龙上
龙上
URL u = new URL(url);
        HttpURLConnection httpConn = (HttpURLConnection) u.openConnection();

        String doing = "数据抓取状态码:" + httpConn.getResponseCode();
        c.write(l_id,url,doing);
//就卡在这里了.后台数据库日志显示状态码:200.然后就没有看到吓一条日志

        InputStreamReader input = new InputStreamReader(httpConn.getInputStream(), Charset.forName(charsetName));
        BufferedReader bufReader = new BufferedReader(input);
        String line = "";
        StringBuilder contentBuf = new StringBuilder();
        while ((line = bufReader.readLine()) != null) {
            contentBuf.append(line);
        }
        String buf = contentBuf.toString();



独孤小败
独孤小败
那可能是表锁住了
龙上
龙上
这个write是写入数据库日志的.
独孤小败
独孤小败
因为你每个里面都 new 了一个 B 类,就有4个 c.write 里面的 c 对象,每个 c (是 FileWriter 吗)都试图去打开文件,可能打开了相同的文件,另外的 c 对象又没释放这个文件,形成了死锁
返回顶部
顶部