精华内容
下载资源
问答
  • sleep和wait方法区别

    2020-05-03 23:00:18
    wait方法 wait是既让出cpu资源,又会释放锁资源; 一般使用在同步方法或者同步代码块中 案例分析 public class WaitSleepDemo { public static void main(String[] args) throws InterruptedExce...

    方法区别

    • sleep方法
      sleep让出cpu资源,但是不会释放锁,不干涉锁行为;
      哪里都可以使用
    • wait方法
      wait是既让出cpu资源,又会释放锁资源;
      一般使用在同步方法或者同步代码块中

    案例分析

    public class WaitSleepDemo {
    
        public static void main(String[] args) throws InterruptedException {
            final Object lock = new Object();
    
            new Thread(() -> {
                System.out.println("Thread A is waiting for the lock");
                synchronized (lock) {
                    System.out.println("Thread A get lock");
                    try {
                        Thread.sleep(20);
                        System.out.println("Thread A do wait method");
                        lock.wait(1000);
                        System.out.println("Thread A done");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
    
            Thread.sleep(10);
    
            new Thread(() -> {
    
                System.out.println("Thread B is waiting for the lock");
                synchronized (lock) {
                    System.out.println("Thread B get lock");
                    try {
                        System.out.println("Thread B is sleeping 10 ms");
                        Thread.sleep(10);
                        System.out.println("Thread B done");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
    

    执行结果:
    在这里插入图片描述

    public class WaitSleepDemo2 {
    
        public static void main(String[] args) throws InterruptedException {
            final Object lock = new Object();
    
            new Thread(() -> {
                System.out.println("Thread A is waiting for the lock");
                synchronized (lock) {
                    System.out.println("Thread A get lock");
                    try {
                        Thread.sleep(20);
                        System.out.println("Thread A do wait method");
                        Thread.sleep(1000);
                        System.out.println("Thread A done");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
    
            Thread.sleep(10);
    
            new Thread(() -> {
    
                System.out.println("Thread B is waiting for the lock");
                synchronized (lock) {
                    System.out.println("Thread B get lock");
                    try {
                        System.out.println("Thread B is sleeping 10 ms");
                        lock.wait(10);
                        System.out.println("Thread B done");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
    

    在这里插入图片描述
    总结

    从上面两个案例打印可以看得出,第一个案例的A线程执行wait方法时,获取到锁的;但是第二个案例A线程执行的wait方法处换成sleep之后,B线程无法在A线程结束前获取到锁!由此得出文章开始的结论。

    展开全文
  • tomcat close_wait状态过多的处理方法

    千次阅读 2019-05-09 17:40:58
    这个时候其实自己也不知道原因出在哪里,然后就开始看tomcat的catalina.out的日志,发现有许多内存溢出。其次,使用了netstat -lanput|grep java 发现了该服务器的close_wait状态特别多,当java的子进程达到了server...

    公司在重新安装应用服务器之后,tomcat+nginx+redis之后,tomcat跑一段时间之后,差不多半个小时之后,就会服务挂掉。这个时候其实自己也不知道原因出在哪里,然后就开始看tomcat的catalina.out的日志,发现有许多内存溢出。其次,使用了netstat -lanput|grep java 发现了该服务器的close_wait状态特别多,当java的子进程达到了server.xml里面的 maxtheards之后,服务就会宕机。

    出现CLOSE_WAIT的原因:TCP连接断开时需进行四次挥手,TCP连接的两端都可发起关闭连接的请求,如果对端发起了关闭连接,但本地没进行后续的关闭连接操作,那么该链接就会处于CLOSE_WAIT状态。虽然该链接已经处于半开状态,但已不能和对端通信,需及时的释放该链接。

    于是我开始了在tomcat里面进行调试,

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"

    maxThreads="1000" minSpareThreads="20" maxIdleTime="10000"/>

     

    这个是开启tomcat线程池的,在tomcat里面默认注释了server.xml里面, maxThreads的意思是能开启的线程最大数量(超过1000的之后的请求只能排队,等待有线程释放后,才能被处理),minSpareThreads是默认最小保持线程的数量,maxIdleTime=600000是默认值,代表当目前线程数量 大于 最小保持minsparethreads之后,便会启动这个机制,60秒就清除不活跃的线程。

    但是这个默认值对我来说还是太大了,于是将60秒改为了10秒。connector配置如下

     

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"

    executor="tomcatThreadPool" #开启线程池

    connectionTimeout="30000"

    connectionUploadTimeout="120000"

    disableUploadTimeout="true" #上传文件的连接时间,可以调大一些

    acceptCount="800"

    maxKeepAliveRequests="1"

    enableLookups="false"

    bufferSize="512"

    socketBuffer="512"

    redirectPort="8443" URIEncoding="utf-8"/>

     

    connectionTimeout #连接超时时间建立一个socket连接后,如果一直没有收到客户端的FIN,也没有数据过来,那么此连接也必须等到30s后,才能被超时释放

    acceptCount 当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100

    maxThreads 不能过大,如果太大的话cpu会消耗大量资源在切换线程,会导致服务器比较卡

     

    从系统内核方面进行优化keepalive vim /etc/sysctl.cnf

    net.ipv4.ip_forward = 1 #开启路由转发

    net.ipv4.ip_nonlocal_bind = 1 #允许绑定非本机ip

    net.ipv4.tcp_syncookies = 1 #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

    net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接

    net.ipv4.tcp_tw_recycle = 1 #表示开启TCP连接中TIME-WAIT sockets的快速回收

    net.ipv4.tcp_fin_timeout = 30 #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间

    上面的4条是优化 time_wait过多的情况

     

    net.ipv4.tcp_keepalive_time = 30

    net.ipv4.tcp_keepalive_probes = 3

    net.ipv4.tcp_keepalive_intvl = 15

     

    使用 watch -n1 -d 'netstat -lanput |grep java |wc -l'检测tomcat的状态

     

    使用脚本对tomcat进行控制,每2分钟启用一次判断tomcat的状态

     

    #!/bin/bash

    tompid=`ps -ef |grep tomcat |grep '/usr/local/'|awk '{print $2}'`

    #判断tomcat的pid

    pingcu()

    {

    curl --connect-time 5 -m 10 -s tomcat应用的网址

    }

    #使用curl测试网页是否畅通,如果线程堆积,curl无法正常访问tomcat

    pingcu >/dev/null

    result=$?

    #能正常访问的话echo $?的值是0 不能的话是非0值

    if [ $result -ne 0 ]; then

    echo `date "+%Y-%m-%d %H:%M:%S"`>> /usr/local/risingtech/tom.log

    echo -e "\e[31m\e[1mtomcat is died\e[0m" >> /usr/local/risingtech/tom.log

    #加上一个时间戳 判断tomcat的启动频率

    kill -9 $tompid

    echo "成功杀死" >> /usr/local/risingtech/tom.log

    /usr/local/tomcat/bin/catalina.sh start && echo -e "\e[32m\e[1mtomcat 重启完毕\e[0m" >>/usr/local/risingtech/tom.log

    exit 2

    else

    echo `date "+%Y-%m-%d %H:%M:%S"`>> /usr/local/risingtech/tom.log

    echo -e "\e[32m\e[1mtomcat is alived\e[0m" >> /usr/local/risingtech/tom.log

    fi

     

    最好定时任务时间错开,避免2个同时重启,导致无法正常访问

    最好还是通过代码上的修改解决问题

     

    最终问题已经解决了。

    在修改之后过了一段时间,访问过大的情况还是会出现close_wait特别多的情况,今天在测试的时候发现,查看nginx的访问log,提取了一个文件

    cat /usr/local/nginx/logs/access.log |grep 项目地址(提取接口) |awk '{print $4,$7}' > jiekou.txt

    cat jiekou1.txt |sort |uniq -c >jieguo.txt

    #去从接口访问,排序那个接口访问的量最大

    得到了一个特别多的amq访问,这个是在网页上的聊天功能,经过控制变量发现,这个东西开启了之后就会每次刷新一次首页,就会出现2个CLOSE_WAIT状态,

    vim /usr/local/tomcat/webapps/cu/WEB-INF/web.xml

     

    <!-- activeMQ -->

    <!-- <servlet>

    <servlet-name>AjaxServlet</servlet-name>

    <servlet-class>org.apache.activemq.web.AjaxServlet</servlet-class>

    <load-on-startup>1</load-on-startup>

    <async-supported>true</async-supported>

    </servlet>

    <servlet-mapping>

    <servlet-name>AjaxServlet</servlet-name>

    <url-pattern>/amq/*</url-pattern>

    </servlet-mapping>

    -->

    注释了之后发现,close_wait没有上涨了,开发说是因为当时没有做超时限制,最终还是解决了这个问题

     

    展开全文
  • 主线程上使用SerialPortEventListener,工作线程中,我有一个客户端套接字与服务器通信。由于到达此工作线程之后return,我仍然需要主线程中完成一些总结工作,因此我想创建一个“伪线程”,主线程中等待...

    哈罗我已经整天调试了我的代码,但是我看不出哪里出了问题。

    我在主线程上使用SerialPortEventListener,在工作线程中,我有一个客户端套接字与服务器通信。由于到达此工作线程之后return,我仍然需要在主线程中完成一些总结工作,因此我想创建一个“伪线程”,在主线程中等待,直到从侦听器onEvent方法通知它为止。

    但是这个伪线程似乎一直在等待。

    我检查了锁定的线程pseudoThread,它们在Runnable和Listener类中应该具有相同的对象ID。

    显示了“ PseudoThread等待中”,但从未显示PseudoThread唤醒。

    控制台输出显示:PseudoThread等待.. .. false通知伪线程。

    PS如果我创建主类的锁public final Object lock = new

    Object();,并更换所有main.pseudoThread有main.lock,我得到java.lang.IllegalMonitorStateException。

    private class Pseudo implements Runnable{

    Main main;

    public Pseudo(Main main) {

    this.main = main;

    }

    @Override

    public void run() {

    synchronized(main.pseudoThread){

    try {

    System.out.println("PseudoThread waiting");

    main.pseudoThread.wait();

    System.out.println("PseudoThread awake");

    } catch (InterruptedException e) {

    e.printStackTrace();

    return;

    }

    }

    }

    }

    在主要方法中:

    public static void main(String[] args) {

    Main main = new Main();

    main.initArduino();

    //more code. including starting the working thread

    main.pseudoThread = new Thread(main.new Pseudo(main));

    main.pseudoThread.start();

    try {

    main.pseudoThread.join();

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    private void initArduino() {

    arduino = new Arduino(this);

    if(!arduino.initialize())

    System.exit(1);

    }

    以及在侦听器类中(它也在主线程中运行)

    //class constructor;

    public Arduino(Main Main){

    this.main = Main;

    }

    //listening method

    public void serialEvent(SerialPortEvent oEvent){

    //some code to interract with working thread.

    record();

    }

    private void record(){

    synchronized(main.pseudoThread){

    main.pseudoThread.notify();

    System.out.println("notified pseudothread.");

    }

    }

    展开全文
  • 记忆顺序:哪个类中?调用后进入哪里?会不会释放锁? sleep():是Thread类中的方法,可以设置具体的休眠时间,时间到了自动唤醒...notify():使用notify()方法之后,线程被唤醒,线程会进入对象锁定池准备。  ...

    记忆顺序:在哪个类中?调用后进入哪里?会不会释放锁?

    sleep():是Thread类中的方法,可以设置具体的休眠时间,时间到了自动唤醒,线程不会释放对象锁。

    wait():是Object类中的方法,调用后线程会进入等待池,线程会释放对象锁

    notify():使用notify()方法之后,线程被唤醒,线程会进入对象锁定池准备

     

    展开全文
  • 昨晚上出现了两次内存溢出,找不到复现的方法,每次出现内存溢出都不一样,两次都是先出现"Disk Write of"写入磁盘失败错误,然后就是druid获取连接失败,然后报OOM异常,接着linux服务器cpu使用率上涨,一直涨到...
  • 之前Ubuntu系统下使用java的getRuntime()方法执行python脚本可以正常运行,今天突然无法运行,也没有任何报错。 参考: Java调用Python脚本无法得到运行结果 JAVA 调PYTHON 文件(使用ANACONDA的环境) waitFor()的...
  • 这段代码示范了条件变量的正确使用方法,以及如何优雅关闭可能正在wait条件变量的线程。windows和Linux下测试都大概是10几万次每秒。条件变量要改变线程的运行状态,故需要系统调用,效率还是比较低的。这点要注意...
  • 程序执行后 exitValue 打印的值一直为1 不知问题出在哪里。 compare 的帮助文档给出的说明是 Return codes Code Meaning 0 Success 1 Binary same 2 Rules-based same 11 Binary differences 12 Similar ...
  • 刚入门学习hadoop,然后在sqoop数据迁移这里遇到了问题,linux下使用sqoop连接不上windows系统的MySQL数据库,按照网上的许多方法都没解决。 linux系统是centos6.4,然后...有没有大牛知道我问题出在哪里?感激不尽!
  • 使用代码例子notifyAllwait和sleep异同点在哪里?小试牛刀题JDK1.5-Lock什么是Lock接口?Lock锁写法演示代码什么是ReentrantLock锁?Condition类解决wait和notify无法使用问题小试牛刀题如何停止线程用stop方法为什么...
  • JUC学习(二)

    2020-03-08 17:11:37
    2.4、生产者消费者问题 sleep和wait的区别 1、类不同 ​ sleep是Thread类中的方法...​ sleep是Thread的一个静态方法在哪里都能够调用。建议通过TimeUnit枚举类来调用。 TimeUnit.SECONDS.sleep(3);//休眠三秒 ...
  • 仅仅使用async关键字,改变不了代码在哪里执行,只有方法的实现代码决定是否启动任何异步工作 错误2. await关键字造成当前线程阻塞,直到被等待的任务完成。要阻塞当前线程直到任务完成,应该调用wait()方法。 await...
  • 多线程是一个神奇的东西,难以捉摸,代码也不好理解。为什么关注多线程呢?...一个是免费公开课,粗略的讲多线程,而我要傻傻的记住wait()方法是释放锁在哪里等待,sleep(arg)是持有锁在睡觉,还有很多...
  • 多线程java_java多线程

    2020-11-14 05:33:06
    多线程是一个神奇的东西,难以捉摸,代码也不好理解。为什么关注多线程呢?...一个是免费公开课,粗略的讲多线程,而我要傻傻的记住wait()方法是释放锁在哪里等待,sleep(arg)是持有锁在睡觉,还有很多...
  • 7.9.4 构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解Java方法 191 7.12 习题 192 第8章 Java中的包(Package)...
  • 7.9.4 构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解Java方法 191 7.12 习题 192 第8章 Java中的包(Package)...
  • 7.9.4 构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解Java方法 191 7.12 习题 192 第8章 Java中的包(Package)...
  • 6.如果一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer 7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? ...
  • Oracle专家高级编程--详细书签版

    热门讨论 2012-08-21 11:57:09
    Oracle公司,Kyte专门负责Oracle数据库,他的任务是帮助使用Oracle数据库的客户,并与他们共同设计和构建系统,或者对系统进行重构和调优。进入Oracle公司之前,Kyte是一名系统集成人员,主要为美国军方和政府...
  • 14.3.2 使用基于表单的身份验证方法 245 14.4 隐藏资源 247 14.5 Struts安全配置 248 14.6 以编程方式提高安全性 250 14.6.1 getAuthType方法 250 14.6.2 isUserInRole方法 250 14.6.3 getUserPrincipal方法 ...
  • 第2部分为SQLServer 2008的准备篇,介绍了SQL Server 2008的功能、特性、各版本的比较、安装方法、SQL Server 2008的服务、客户端的工具等;第3部分为SQL Server 2008的基本操作篇,介绍如何管理与配置SQL Server ...
  • 第2部分为SQLServer 2008的准备篇,介绍了SQL Server 2008的功能、特性、各版本的比较、安装方法、SQL Server 2008的服务、客户端的工具等;第3部分为SQL Server 2008的基本操作篇,介绍如何管理与配置SQL Server ...
  • 这里仍然使用术语IPC,尽管通信是线程之间而不是进程之间进行的。  还可以把后两种设计形式结合起来:用多个进程来实现,其中每个进程包含几个线程。这种情况下,进程内部的线程之间可以通信,不同的进程...
  • java面试题

    2018-01-01 15:35:15
    54.2. Socket在哪里呢? 31 54.3. Socket是什么呢? 32 54.4. socket的实现步骤 37 55. Servlet 38 55.1. Servlet工作流程 38 55.2. servlet的生命周期 38 55.3. Servlet执行时一般实现哪几个方法? 38 56. 会话跟踪...
  • 这里仍然使用术语IPC,尽管通信是线程之间而不是进程之间进行的。  还可以把后两种设计形式结合起来:用多个进程来实现,其中每个进程包含几个线程。这种情况下,进程内部的线程之间可以通信,不同的进程...
  • 14.3.2 使用基于表单的身份验证方法 245 14.4 隐藏资源 247 14.5 Struts安全配置 248 14.6 以编程方式提高安全性 250 14.6.1 getAuthType方法 250 14.6.2 isUserInRole方法 250 14.6.3 getUserPrincipal方法 251 ...
  • 14.3.2 使用基于表单的身份验证方法 245 14.4 隐藏资源 247 14.5 Struts安全配置 248 14.6 以编程方式提高安全性 250 14.6.1 getAuthType方法 250 14.6.2 isUserInRole方法 250 14.6.3 getUserPrincipal方法 251 ...
  • 14.3.2 使用基于表单的身份验证方法 245 14.4 隐藏资源 247 14.5 Struts安全配置 248 14.6 以编程方式提高安全性 250 14.6.1 getAuthType方法 250 14.6.2 isUserInRole方法 250 14.6.3 getUserPrincipal方法 251 ...
  • 2.4.9 路由器的配置过程中查询以S开头所有命令的方法是? 2.5.0 第一次配置路由器时可以使用方法为? 2.5.1 何种状态下可以为路由器改名? 2.5.2 某公司申请到一个C类IP地址,但要连接6个的子公司,最大的...
  •  这本书里,你将会学到笔者性能优化方面的一些思路和思考,一些故障处理的方法和原则,这些东西是笔者实践中长期积累的心得体会,笔者看来,掌握处理问题的方法和分析问题的思路日常工作中显得更为重要,...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

wait方法在哪里使用