创建线程的方式有三种,一是创建Thread实例,二是实现Runnable接口,三是实现Callable接口,Runnable接口和Callable接口的区别是一个无返回值,一个有返回值;不管是Runnable还是Callable接口,都需要借助Thread去运行;

Thread提供的主要线程操作接口有:

一、Priority(线程优先级):

功能:

线程的优先级,优先级高的线程能得到更多的cpu资源;

Java中线程优先级的取值范围是1~10,创建线程时初始默认的线程优先级是5;

Thread.getPriority获取指定线程的优先级,Thread.setPriority(value)设置指定线程的优先级;

源码分析:

Setpriority调用了setPriority0方法,

private native void setPriority0(int newPriority);

setPriority0是一个本地方法,其实现是由操作系统实现的;

二、Sleep(线程休眠):

功能:

自指定的毫秒数内,让当前正在执行的线程休眠(暂停执行);

如:Thread.sleep(1000);

源码分析:

public static native void sleep(long millis) throws InterruptedException;

1、静态方法,休眠当前正在执行的线程,通常是执行这段代码的线程(但并不一定总是);

2、本地方法,其实现是由操作系统实现;

三、yield(线程让步):

功能:

使当前线程从执行态变为可执行态,也就是就绪态吧。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次不会执行到了。

源码分析:

public static native void yield();

1、静态方法,针对的是当前线程(Thread.CurrentThread);

2、本地方法,由操作系统实现;

四、join(线程合并):

功能:

使所属的线程对象x正常执行run方法,而当前线程z无限期的阻塞,直到线程x执行完成并销毁后再执行;

Join具有使线程排队运行的作用;

Join的实现其实是调用了wait使得当前线程阻塞,等待指定的线程执行完成后会调用线程自身的notifyAll方法,使得当前线程从join处继续执行;

Join与Synchronized的区别是join在内部使用wait进行等待,Synchronized使用的是对象监视器原理作为同步;

Join与sleep的区别是:调用join后,当前线程的锁被释放,其他线程可以调用此线程中的同步方法了,而sleep方法却不释放锁;

源码分析:

可以看到join调用的是wait(0)和wait(delay)两个方法来完成的阻塞排队的;

五、interrupt/isInterrupted(线程终止):

功能:

Interrupt用来停止线程,但并不是真正停止了线程,而是在指定线程中打了一个停止的标记,需要结合interrupted或者isInterrupted来判断线程是否停止并退出运行或者抛出异常;interrupted判断当前线程(是指运行this. Interrupted的线程)是否已经中断,线程的中断状态由该方法清除,也就是说如果联系调用两次,由于第一次调用时清除了标记,因此第二次永远返回false,isInterrupted测试线程是否已经中断,但不清除标记;

源码分析:

Interrupt调用interrupt0:private native void interrupt0();, 而interrupt0是本地方法,由操作系统实现;interrupt是非静态方法,因此作用与指定的线程对象;

Interrupted是静态方法,从代码可以看出其作用于当前线程对象,与调用时指定的线程对象无关,且最终实现是调用的isInterrupted本地方式,由操作系统实现;

六、stop/suspend(结束线程/暂停线程):

功能:

这两个方法都是建议废除的;

Stop可以强制结束线程,有可能使一些请理性的工作得不到完成;

Suspend是暂停线程的执行,暂停后可以通过resume恢复线程的执行;

源码分析:

Stop调用了本地方法stop0:private native void stop0(Object o);

而suspend也是调用了本地方法suspend0:private native void suspend0();

七、resume(恢复线程运行):

功能:

这个方法也是建议废除的;

作用是恢复由suspend暂停的线程继续运行;

源码分析:

Resume调用本地方法resume0:private native void resume0();

八、wait(线程阻塞):

功能:

这个方法不属于Thread类的方法,而是Object类的方法;

Wait方法使当前线程进入睡眠状态,也即阻塞当前线程,调用wait方法后,锁被自动释放;

源码分析:

可以看出wait是本地方法,由操作系统负责实现;

九、notify/notifyAll(通知阻塞的线程运行):

功能:

Notify的功能是唤醒在此对象监视器上等待的单个线程(随机唤醒等待队列里的一个线程),notifyAll的作用是唤醒在此对象监视器上等待的所有线程;这两个方法一般是和wait方法配合起来使用(执行完wait后自动释放锁,而执行完notify/notifyAll后却不自动释放锁);

源码分析:

这两个方法都是本地方法,由操作系统负责实现;

注意:

1、 使用wait()、notify()和notifyAll()时需要先对调用对象加锁;

2、 调用wait()方法后,线程状态由RUNNING变为WAITING,并将当前线程放置到对象的等待队列。

3、 调用wait方法后就放弃了锁,并进入了对象的等待队列WaitQueue中进入等待状态;当其他线程调用notify/notifyAll后,将WaitThread从WaitQueue中移到SynchronizedQueue中,此时WaitThread变为阻塞状态,notifyThread释放锁之后,WaitThread再次获取到锁并从wait方法返回处继续执行;

4、 notify()或notifyAll()方法调用后,等待线程依旧不会从wait()返回,需要调用notify()或notifAll()的线程释放锁之后,等待线程才有机会从wait()返回;

5、 从wait()方法返回的前提是获得了调用对象的锁;

十、Future/FutureTask:

Future就是在启动Callable接口的线程执行后,可以继续去做其他事情,当流程进行到想要获取刚才的线程的执行结果时,可以直接从Future接口去获取,如果还未执行完成,则会阻塞等待执行完成并返回结果,可以使用isdone判断是否执行完成;

FutureTask就是融合Future接口和Callable功能的类,执行时传入Callable任务,然后启动执行,然后在需要返回值的地方使用FutureTask.get()获取返回值;

Future接口提供的方法有:cancel, isCancelled, isDone, get;

FutureTask类的实现框架如图:

FutureTask.Run调用Sync.innerRun方法:

在innerRun中先将状态从Ready设置为Running,然后调用Task的Call方法获取返回值,最后将返回值result保存起来;

FutureTask.set调用Sync.innerSet方法,innerSet中如果状态已经是完成状态则直接返回,如果取消了或者正在运行中,则释放共享锁,通知调用线程可以读取返回值了;

如果运行完成,则设置状态为已完成(Ready为起始状态,Running为正在运行状态,RAN为已完成状态,CANCELLEDwie取消状态),将返回值保存到result,释放共享锁。

FutureTask.get调用Sync.innerGet方法,innerGet直接返回result值;

java中Thread类分析的更多相关文章

  1. 【Java中的线程】java.lang.Thread 类分析

    进程和线程 联想一下现实生活中的例子--烧开水,烧开水时是不是不需要在旁边守着,交给热水机完成,烧开水这段时间可以去干一点其他的事情,例如将衣服丢到洗衣机中洗衣服.这样开水烧完,衣服洗的也差不多了.这 ...

  2. Java中Thread类的start()和run()的区别

    1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码. 通 过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪 ...

  3. Java中Thread类的join方法到底是如何实现等待

    现在的场景是A线程执行:public void run(){ bThread.join(0);//把b线程加入到当前线程(a线程),等待b结束,当前a线程才会结束.}B线程执行public void ...

  4. Java 线程--继承java.lang.Thread类实现线程

    现实生活中的很多事情是同时进行的,Java中为了模拟这种状态,引入了线程机制.先来看线程的基本概念. 线程是指进程中的一个执行场景,也就是执行流程,进程和线程的区别: 1.每个进程是一个应用程序,都有 ...

  5. 【转】java中Thread类方法介绍

    原文: java中Thread类方法介绍 http://blog.csdn.net/seapeak007/article/details/53395609 这篇文章找时间分析一下!!!:http:// ...

  6. Java并发--Thread类详情

    以下是本文的目录大纲: 一.线程的状态 二.上下文切换 三.Thread类中的方法 转载原文链接:http://www.cnblogs.com/dolphin0520/p/3920357.html 一 ...

  7. java.lang.Thread类详解

    java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...

  8. Java中Object类hashCode的底层实现

    Java中Object类hashCode的底层实现 openjdk\jdk\src\share\native\java\lang\Object.c 42 static JNINativeMethod ...

  9. 如何在Java中测试类是否是线程安全的

    通过优锐课的java核心笔记中,我们可以看到关于如何在java中测试类是否线程安全的一些知识点汇总,分享给大家学习参考. 线程安全性测试与典型的单线程测试不同.为了测试一个方法是否是线程安全的,我们需 ...

随机推荐

  1. BZOJ-1010 玩具装箱toy (斜率优化)

    题目大意:将n个数分成若干组,并且每组的数在原数组中应是连续的,每组会产生的代价为sum(i)-sum(j)+i-j-1-m,m为已知的常数.求最小代价. 题目分析:定义dp(i)表示将前 i 个元素 ...

  2. spring中@Scope作用域的注解

    @Scope简单点说就是用来指定bean的作用域 官方解释是:scope用来声明IOC容器中的对象应该处的限定场景或者说该对象的存活空间,即在IOC容器在对象进入相应的scope之前,生成并装配这些对 ...

  3. 30. Substring with Concatenation of All Words *HARD*

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  4. spring cloud学习(七)Spring Cloud Config(续)

    Spring Cloud Config(续) 个人参考项目 个人博客 : https://zggdczfr.cn/ 个人参考项目 : (整合到上一个案例中)https://github.com/Fun ...

  5. spring cloud学习(六)Spring Cloud Config

    Spring Cloud Config 参考个人项目 参考个人项目 : (希望大家能给个star~) https://github.com/FunriLy/springcloud-study/tree ...

  6. 白化whitening

    原文地址:http://blog.csdn.net/hjimce/article/details/50864602 作者:hjimce 一.相关理论     白化这个词,可能在深度学习领域比较常遇到, ...

  7. 快速切题 usaco ariprog

    题目:给定3<=n<=25,m<250,求m及以内的两两平方和能否构成为n的等差数列 1 WA 没有注意到应该按照公差-首项的顺序排序 2 MLE 尝试使用桶,但是实际上那可能是分散 ...

  8. Integer封装类的相关知识

    java中,在一些情况下会有自动装箱与自动拆箱. 自动拆箱/装箱是在编译期,依据代码的语法,决定是否进行拆箱和装箱动作.装箱过程:把基本类型用它们对应的包装类型进行包装,使基本类型具有对象特征.拆箱过 ...

  9. Crystal Report Error: Either the Crystal Reports registy key permission are insufficient or the Crystal Reports runtime is not installed correctly

    在64位 Windows 7中水晶报表的错误: Crystal Report Error: Either the Crystal Reports registy key permission are ...

  10. SharePoint BDC(Business Data Connectivity)服务-PowerShell

    1. 获取BCS服务应用程序的标识 Get-SPServiceApplication 2. 获取指定的BCS服务应用程序实例 $bcs = Get-SPServiceApplication -Iden ...