文档章节

关于线程和多线程

alvaDing
 alvaDing
发布于 2016/09/12 19:52
字数 469
阅读 12
收藏 0

首先Object中的方法:wait()、notify()、notifyAll()。

Thread中的方法:start()、run()、sleep()、yield()、interrupt()方法。

wait和notify都需要在同步代码块中使用。

java 线程状态转换图:

新建一个线程-start()->可运行-run()->运行-->死亡

1.如果一个运行的线程sleep(),2.t2.join()方法,3.等待用户输入,三种情况下线程会进入阻塞状态。

运行的线程会试图获取锁,synchronized(),线程获取到锁,就进入可运行状态,如果获取不到锁,就进入等待队列中等待;

如果线程调用wait()方法,JVM会把线程放入等待队列中,等待被其他进程唤醒(notify());

如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。

当有线程调用了对象的 notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。

TODO: 结合源码分析。

总结点:1.sleep与wait的区别:

sleep()不会释放锁,wait会释放锁,等别的进程调用notify的时候,该阻塞的进程可能会重新获得锁;

sleep是Thread的方法,wait是Object的方法。sleep不会引起锁的变化。

join()方法具有使线程排队运行的作用,当前线程等待。jion(long )中的参数可以指定等待时间。

join()方法的内部是使用wait实现的,所以join会释放锁。

public final synchronized void join(long var1) throws InterruptedException {
    long var3 = System.currentTimeMillis();
    long var5 = 0L;
    if(var1 < 0L) {
        throw new IllegalArgumentException("timeout value is negative");
    } else {
        if(var1 == 0L) {
            while(this.isAlive()) {
                this.wait(0L);
            }
        } else {
            while(this.isAlive()) {
                long var7 = var1 - var5;
                if(var7 <= 0L) {
                    break;
                }

                this.wait(var7);
                var5 = System.currentTimeMillis() - var3;
            }
        }

    }
}

 

© 著作权归作者所有

alvaDing
粉丝 0
博文 10
码字总数 3248
作品 0
西安
程序员
私信 提问
Java线程面试问题

在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。那么你就应该准备很多关于多线程的问题,一般面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多...

沧海为水
2016/11/28
129
0
【转】15个顶级Java多线程面试题及回答

Java 线程面试问题   在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务...

一只死笨死笨的猪
2014/09/30
334
0
15个顶级Java多线程面试题及回答

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务中多...

LCZ777
2014/05/27
639
0
Android多线程:继承Thread类 & 实现Runnable接口 使用解析(含实例教程)

前言 在开发中,多线程的使用十分常见 今天,我将全面解析多线程中最常见的2种用法:继承类 & 实现接口 Part 1:继承Thread类 目录 1. 简介 class MyThread extends Thread{ // 步骤2:复写r...

carson_ho
2018/05/30
0
0
.NET简谈组件程序设计之(上下文与同步域)

我们继续学习.NET多线程技术,这篇文章的内容可能有点复杂。在打破常理之后,换一种新的思考模型最为头疼。这篇文章里面会涉及到一些不太常见的概念,比如:上下文、同步域等等。我也是最近才...

王清培
2011/08/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部