并发基本概念介绍

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 条评论
登录 后参与评论

相关文章

来自专栏Linyb极客之路

Spring中@Async用法总结

引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来...

1462
来自专栏Coding01

看 Laravel 源代码了解 Container

自从上文《看 Laravel 源代码了解 ServiceProvider 的加载》,我们知道 Application (or Container) 充当 Lar...

1795
来自专栏前端杂货铺

node中的Stream-Readable和Writeable解读

在node中,只要涉及到文件IO的场景一般都会涉及到一个类-Stream。Stream是对IO设备的抽象表示,其在JAVA中也有涉及,主要体现在四个类-Inpu...

3639
来自专栏Android中高级开发

Android并发编程 多线程与锁

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,如果能给各位看官带来一丝启发或者帮助,那真是极好的。

972
来自专栏技术墨客

Hazelcast集群服务(4)——分布式Map

    在第一篇介绍Hazelcast的文章已经提到,Hazelcast为Java中绝大部分数据结构提供了分布式实现。我们常用的Map、List、Queue等数...

1333
来自专栏老马寒门IT

Node入门教程(8)第六章:path 模块详解

1504
来自专栏Android群英传

Retrofit源码分析

1144
来自专栏岑玉海

oozie 重新提交作业

  在oozie的运行过程当中可能会出现错误,比如数据库连接不上,或者作业执行报错导致流程进入suspend或者killed状态,这个时候我们就要分析了,如果确...

3139
来自专栏java一日一条

Jsoup代码解读之五-parser(中)

Jsoup parser的入口facade,封装了常用的parse静态方法。可以设置maxErrors,用于收集错误记录,默认是0,即不收集。与之相关的类有Pa...

552
来自专栏流柯技术学院

TestNG官方文档中文版(5)-测试方法/类和组

5 - Test methods, Test classes and Test groups 5.1 - Test groups TestNG容许执行复...

851

扫码关注云+社区