多线程学习笔记-1-进程和线程以及状态

多线程学习笔记-1-进程和线程以及状态

  1. 进程与线程的区别:
    • 进程:是系统进行分配和管理资源的基本单位
    • 线程:进程的一个执行单元,是进程内调度的实体、是CPU调度和分派的基本单位,是比进程更小的独立运行的基本单位。线程也被称为轻量级进程,线程是程序执行的最小单位。
    • 一个程序至少一个进程,一个进程至少一个线程。
    • 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式进行。如何处理好同步与互斥是编写多线程程序的难点。多进程程序更健壮,进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,所以可能一个线程出现问题,进而导致整个程序出现问题
  2. 线程的状态及其相互转换
    • 首先我们查看源码Thread,1742行,内部枚举类,State
       public enum State {
              /**
               * Thread state for a thread which has not yet started.
               */
              NEW,
      
              /**
               * Thread state for a runnable thread.  A thread in the runnable
               * state is executing in the Java virtual machine but it may
               * be waiting for other resources from the operating system
               * such as processor.
               */
              RUNNABLE,
      
              /**
               * Thread state for a thread blocked waiting for a monitor lock.
               * A thread in the blocked state is waiting for a monitor lock
               * to enter a synchronized block/method or
               * reenter a synchronized block/method after calling
               * {@link Object#wait() Object.wait}.
               */
              BLOCKED,
      
              /**
               * Thread state for a waiting thread.
               * A thread is in the waiting state due to calling one of the
               * following methods:
               * <ul>
               *   <li>{@link Object#wait() Object.wait} with no timeout</li>
               *   <li>{@link #join() Thread.join} with no timeout</li>
               *   <li>{@link LockSupport#park() LockSupport.park}</li>
               * </ul>
               *
               * <p>A thread in the waiting state is waiting for another thread to
               * perform a particular action.
               *
               * For example, a thread that has called <tt>Object.wait()</tt>
               * on an object is waiting for another thread to call
               * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
               * that object. A thread that has called <tt>Thread.join()</tt>
               * is waiting for a specified thread to terminate.
               */
              WAITING,
      
              /**
               * Thread state for a waiting thread with a specified waiting time.
               * A thread is in the timed waiting state due to calling one of
               * the following methods with a specified positive waiting time:
               * <ul>
               *   <li>{@link #sleep Thread.sleep}</li>
               *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
               *   <li>{@link #join(long) Thread.join} with timeout</li>
               *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
               *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
               * </ul>
               */
              TIMED_WAITING,
      
              /**
               * Thread state for a terminated thread.
               * The thread has completed execution.
               */
              TERMINATED;
          }
    • 线程状态
      • 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。

      • 运行(RUNNABLE):处于可运行状态的线程正在JVM中执行,但它可能正在等待来自操作系统的其他资源,例如处理器。

      • 阻塞(BLOCKED):线程阻塞于synchronized锁,等待获取synchronized锁的状态。

      • 等待(WAITING):Object.wait()、join()、 LockSupport.park(),进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

      • 超时等待(TIME_WAITING):Object.wait(long)、Thread.join()、LockSupport.parkNanos()、LockSupport.parkUntil,该状态不同于WAITING,它可以在指定的时间内自行返回。

      • 终止(TERMINATED):表示该线程已经执行完毕。

    • 我们可以通过代码去实现查看,用java自带的工具jconsole,打开cmd直接输入jconsole即可

      • 初始(NEW):

        • 这个我想大家应该没什么疑问。就是以下代码,还没有调用start();

          Thread thread = new Thread();
      • 运行(RUNNABLE):处于可运行状态的线程正在JVM中执行,但它可能正在等待来自操作系统的其他资源,例如处理器

        • 调用start();就是运行状态了。需要注意的是CPU分配给线程相应的时间,所以start(),也不一定已经执行了run方法

          public static void main(String[] args) {
                  Thread thread = new Thread(() ->{
                      try {
                          System.in.read(); //不让程序立马退出,打开jconsole
                      }catch (IOException e){
                          e.printStackTrace();
                      }
                  });
                  thread.start();
              }
        • 多线程学习笔记-1-进程和线程以及状态
      • 阻塞(BLOCKED):线程阻塞于synchronized锁,等待获取synchronized锁的状态。

        public static void main(String[] args) throws Exception{
                Object obj = new Object();
                Thread thread1 = new Thread(() -> {
                    synchronized(obj){
                        try {
                            System.out.println("thread1:拿到锁了");
                            //为了让该线程一直拿到锁
                            Thread.sleep(1000000000L);
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                });
                thread1.start();
                //为了保证thread能拿到锁
                Thread.sleep(3000);
                Thread thread2 = new Thread(() -> {
                   synchronized (obj){
                       System.out.println("thread2:拿到锁了");
                   }
                });
                thread2.start();
            }
      • 打开jconsole查看线程第二个
        • 多线程学习笔记-1-进程和线程以及状态
      • 超时等待(TIME_WAITING)
        • 打开上图的Thread-0

        • 多线程学习笔记-1-进程和线程以及状态​​​​​​​

  3.  

    一图解千愁

    • 多线程学习笔记-1-进程和线程以及状态​​​​​​​

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/xpx/blog/2996952

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101223.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java方法重载_java入门方法的使用

    Java方法重载_java入门方法的使用在Java中,同一个类中的多个方法可以有相同的方法名称,但是有不同的参数列表,这就称为方法重载(methodoverloading)。参数列表又叫参数签名,包括参数的类型、参数的个数、参数的顺序,只要有一个不同就叫做参数列表不同。重载是面向对象的一个基本特性。publicclassDemo{ //一个普通得方法,不带参数,无返回值 publicvoidadd(){ //met…

    2025年6月25日
    2
  • JS跳转代码_js中跳转页面路径

    JS跳转代码_js中跳转页面路径一、常规的JS页面跳转代码1、在原来的窗体中直接跳转用2、在新窗体中打开页面用:3、JS页面跳转参数的注解参数解释:第2种:第3种:第4种:第5种:三、页面停留指定时间再跳转(如3秒)四、根据访客来源跳转的JS代码1、JS判断来路代码此段代码主要用于百度谷歌点击进入跳转,直接打开网站不跳转:2、JS直接跳转代码3、ASP跳转代码判断来路<%  ifinstr(Request.ServerVariables(“http_referer”),“www

    2022年8月13日
    4
  • restful 幂等性(什么是幂次法则)

    理解RESTful的幂等性,并且设计符合幂等规范的高质量RESTfulAPI。怎么理解幂等性HTTP幂等方法,是指无论调用多少次都不会有不同结果的HTTP方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。还是以之前的博文的例子为例。【GET】/users#查询用户信息列表【GET】/users/1…

    2022年4月10日
    70
  • HP磁盘阵列损坏的修复

    HP磁盘阵列损坏的修复公司中有一台HPDL380G5服务器硬盘红灯报警,使用ACU工具查看后,显示磁盘损坏,截图如下:更换磁盘后,显示正在重建,即属于正常,截图如下:更换硬盘前需要确认硬盘是什么型号,哪个系列的,以及硬盘的大小:最重要的是SPARE号一定要保持一致。下面给大家提供一下更换磁盘的一些资料以及注意事项:1、更换的磁盘与原先的磁盘无比保持大小相同,型号…

    2022年5月30日
    43
  • tomcat服务启动,但是无法访问网站_java获取request的所有参数

    tomcat服务启动,但是无法访问网站_java获取request的所有参数废话不说,真接上代码。HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setRequestProperty(“Content-Length”,”0″);中的第二句没有起作用(发出去的http头里,未含有Content-Length字段)。但是这个代码在android平台上跑的时候,第二句是起了作用的。为…

    2025年10月21日
    4
  • DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016 解决方案[通俗易懂]

    DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016 解决方案[通俗易懂]DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016 解决方案

    2022年4月23日
    170

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号