并发基本概念介绍

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关键字。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老马说编程

(69) 线程的中断 / 计算机程序的思维逻辑

本节主要讨论一个问题,如何在Java中取消或关闭一个线程? 取消/关闭的场景 我们知道,通过线程的start方法启动一个线程后,线程开始执行run方法,run...

1799
来自专栏王磊的博客

Java并发编程(一)Thread详解

由上描述,可以得知线程作为cpu的基本调度单位,只有把多线程用好,才能充分利用cpu的多核资源。

301
来自专栏余林丰

12.ThreadPoolExecutor线程池原理及其execute方法

jdk1.7.0_79   对于线程池大部分人可能会用,也知道为什么用。无非就是任务需要异步执行,再者就是线程需要统一管理起来。对于从线程池中获取线程,大部分...

1917
来自专栏Python小屋

Python实现带有阻塞和超时放弃功能的队列结构

本文代码对Python列表进行封装并模拟了队列结构,入队时如果队列已满则阻塞当前线程,超时则放弃;出队时如果队列已空则阻塞当前线程,超时则放弃。 import ...

2964
来自专栏Java 源码分析

Exectors框架 源码分析

Exectors框架 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE 方便,...

2546
来自专栏xdecode

线程的基本操作

1456
来自专栏拭心的安卓进阶之路

并发编程1:全面认识 Thread

线程简介 现在操作系统在运行一个程序时,会自动为其创建一个进程,不论是 PC 还是 Android。 一个进程内可以有多个线程,这些线程作为操作系统调度的最小单...

1928
来自专栏拭心的安卓进阶之路

并发编程1:全面认识 Thread

线程简介 现在操作系统在运行一个程序时,会自动为其创建一个进程,不论是 PC 还是 Android。 一个进程内可以有多个线程,这些线程作为操作系统调度的最小单...

1935
来自专栏Java 源码分析

Exectors框架 源码分析

Exectors框架 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE 方便,...

2697
来自专栏小灰灰

Java 并发排序

利用并发来实现排序 <!-- create time: 2016-03-14 09:49:12 --> 1. 说明 本节主要结合排序的实例来演示多线程执行任...

1817

扫码关注云+社区