zoukankan      html  css  js  c++  java
  • 并发基本概念介绍

    1.线程的几种状态

    线程有以下几种状态:

    1.NEW:已经创建,但是还没有执行,如以下代码输出结果为NEW

    Thread thread = new Thread();
    System.out.println(thread.getState());
    

    2.RUNNABLE:正在运行的线程,如以下代码输出为:RUNNABLE

    final Thread thread = new Thread(){
          @Override
          public void run() {
              System.out.println(this.getState());
          }
      };
      thread.start();
    

    3.BLOCKED:正在等待获取锁的线程,这种需要两个线程同时访问同步方法:如下代码所示:
    private static final Object LOCK = new Object();

    public static void main(String [] args){
        Thread thread = new Thread(){
            @Override
            public void run() {
                lock();
            }
        };
    
        Thread thread2 = new Thread(){
            @Override
            public void run() {
                lock();
            }
        };
        thread.setName("线程1");
        thread2.setName("线程2");
        thread.start();
        thread2.start();
    }
    
    public static void lock(){
    
        synchronized (LOCK){
            try {
                Thread.sleep(1000000);
            }catch (Exception e){
    
            }
        }
    }
    

    执行以上程序,使用jstack可以看到如下结果:

    可以看到线程1的状态是BLOCKED,线程2的状态是TIMED_WAITING

    4.WAITING:由于调用了Object.wait、Thread.join或者LockSupport.park方法处理等待其他线程唤醒的状态

    5.TIMED_WAITING:指定等待时间的等待状态

    6.TERMINATED:已经完成的线程

    Thread thread = new Thread(new Runnable() {
            public void run() {
            }
        });
        thread.start();
        try {
            thread.join();
        }catch (Exception e){
        }
        System.out.println(thread.getState().name());
    

    以上代码执行结果:TERMINATED

    参考:java.lang.Thread.State

    2.同步和异步

    同步和异步是用来行用方法调用的两个词,同步调用一个方法时,只有在方法执行结束之后才会返回执行后面的代码,而异步调用时候,无论调用的方法有没有执行完,调用的线程都会返回继续执行后面的代码。

    3.阻塞和非阻塞

    阻塞和非阻塞我认为是和同步和异步同一种概念针对不同对象的两种说法,前者是针对线程而讲的,当多个线程访问共享资源,当有一个线程正在访问,而其他线程正在等待的状态就称为阻塞。反之为非阻塞。最常见的阻塞现象是添加synchronized关键字。

  • 相关阅读:
    动态规划之最大子段和问题
    hdu1203 I NEED A OFFER!---概率DP(01背包)
    hdu1087 Super Jumping! Jumping! Jumping!---基础DP---递增子序列最大和
    hdu2062 Subset sequence----递推
    java线程基础巩固---通过实验分析This锁和Class锁的存在
    java8学习之BiFunction函数式接口实例演示&Predicate函数式接口详解
    java8学习之Function与BiFunction函数式接口详解
    java8学习之Lambda表达式继续探讨&Function接口详解
    java8学习之Lambda表达式深入与流初步
    java8学习之深入函数式接口与方法引用
  • 原文地址:https://www.cnblogs.com/vitasyuan/p/7445945.html
Copyright © 2011-2022 走看看