java-线程-基础
线程状态及转化
借用网上的一幅图:

说明:
线程一共分为5种状态
新建状态(new)
线程对象被创建后,就进入了新建状态,例如:Thread t = new Thread();
就绪状态(Runnable)
线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。
例如,thread.start()。处于就绪状态的线程,然后等待CPU调度执行。可不是run()方法-_-;
当如果多次调用start(),这时会报异常。
public synchronized void start() {
//A zero status value corresponds to state "NEW".
if (threadStatus != 0)
throw new IllegalThreadStateException();
运行(Running)
线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。
堵塞(blocked)
阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种,状态是两种(blocked 和waiting):
- 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。
- 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
- 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
blocked 和waiting 区别,blocked是在临界点外面等待进入,waiting是在临界点里面等待notify,当线程调用了join方法,jion了另外的线程的时候,也会进入waiting状态,等待被它jion的线程结束。
死亡(Dead)
线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
线程的创建
线程创建有3中方式:
1、继承Thrad:
Thread t = new Thread(){
public vvoid run(){
System.out.println("new Thread");
};
};
2、实现Runnable接口:
Thread t = new Thread(new Runnable(){
public void run(){
System.out.println("new Thread");
};
});
3、使用Callable和Future创建线程
FutureTask<String> ft = new futureTask<String>(){
public String call() throws Exception{
System.out.println("new Thread");
return "abc";
}
}
Thread t = new Thread(ft);
ft.start();
String result= ft.get();
线程方法
Object中方法
wait(),notify(),notifyAll()都是定义在Object类中,它们都是依赖于同步锁,而同步锁是对象锁持有,并且每个对象只有一个!这就是为什么notify(),wait()等函数定义在Object类,而不是Thread类中的原因。
注意:调用wait/notify/notifyAll一定是在获取对象的锁之后,否则会报错哈!java.lang.IllegalMonitorStateException
wait()
方法是将当前线程进入等待(waiting)状态,同时也会让当前线程释放它持有的锁(同步锁),直到其他线程调用此对象的notify()活notifyAll(),唤醒当前对象上的线程(单个或所有),让其进入就绪状态,等待cpu调度,才能继续执行wait之后的代码;
wait(long timeout)
也是让当前的线程进入等待(TIMED_WAITING)状态,该方法可以指定超时时间,当调用此对象的notify()或者NotifyAll(),或者超过指定的时间,则线程也会别唤醒,进入就绪状态;
wait(long timeout,int naous)
notify()和notifyAll()是唤醒当前对象上的等待线程,notify是唤醒单个线程,而notifyAll则是唤醒所有的线程;
整体流程是这样:当一个线程获取对象的同步锁后,然后执行直到wait()方法,这时该线程进入等待状态,释放该对象的同步锁,这时另外一个线程(唤醒线程)获取同步锁后(这里的同步锁一定是和等待线程的同步锁是同一个),执行到notify()或notifyAll()后,才能唤醒等待线程,虽然等待线程被唤醒,但是它不能立刻执行,因为唤醒线程还持有该对象的同步锁,必须等待唤醒线程释放了对象的同步锁之后,等待线程才能获取对象的同步锁进而继续运行。
Thread中方法
yeild(),sleep()都是定义在Thread类中
yeild()
它的作用是让步,也就是说由正在运行的状态进入到就绪状态,从而让其他具有相同优先级的线程获取执行权,但是,并不能保证在当前线程调用yeild方法后,其他线程一定能获取执行权,也有可能是当前线程再次进入运行状态继续执行。
sleep()
让当前线程休眠,即让当前线程由运行状态转换到阻塞状态,sleep可指定休眠时间,当线程的休眠时间超过了指定的时间,线程会被唤醒,由阻塞状态变成就绪装,然后等待cpu调度。
特别注意,sleep()是不会释放对象的同步锁,就是单纯的让线程阻塞。
interrupt()
当线程调用interrupt(),只是设置了线程的中断状态,并不会终止线程,剩下的是由你自己来处理该线程怎么办,wait(), wait(timeout), join(), sleep(timeout), await(),await(timeout)等方法都是可以被interrupt()方法中断的。
线程释放锁一个是方法执行完、调用wait、代码抛出异常。
java-线程-基础的更多相关文章
- Java 线程基础
Java 线程基础
- Java线程基础实例
概述 Java线程是一个在实战开发中经常使用的基础功能,而在Java中线程相关的类在java.lang和java.util.concurrent里 Thread package thread.base ...
- Java线程基础知识(状态、共享与协作)
1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...
- java线程基础知识----线程与锁
我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...
- java线程基础知识----线程基础知识
不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...
- java线程基础巩固---线程生命周期以及start方法源码剖析
上篇中介绍了如何启动一个线程,通过调用start()方法才能创建并使用新线程,并且这个start()是非阻塞的,调用之后立马就返回的,实际上它是线程生命周期环节中的一种,所以这里阐述一下线程的一个完整 ...
- Java 线程基础知识
前言 什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程 ID,当前指令指针 (PC),寄存器集合和堆栈组成.另外,线 ...
- java 线程基础篇,看这一篇就够了。
前言: Java三大基础框架:集合,线程,io基本是开发必用,面试必问的核心内容,今天我们讲讲线程. 想要把线程理解透彻,这需要具备很多方面的知识和经验,本篇主要是关于线程基础包括线程状态和常用方法. ...
- JAVA线程基础
一.线程状态 由于参考的维度不一样,线程状态划分也不一样,我这里简单的分为5大类,并且会说明状态变迁的详细过程:
- 线程之一:JAVA线程基础
参考core java,马士兵视频 1.线程的基本概念 (1)一个线程是一个程序内部的顺序控制流. (2)线程和进程 –每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大. –线程:轻量 ...
随机推荐
- VMware Ubuntu安装详细过程(详细图解)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.下载Ubuntu镜像文件 下载地址:http://mirrors.aliyun.com/ubuntu-releases/16. ...
- Mysql从入门到精通整理
目录 mysql基础 mysql进阶 mysql高级 mysql优化 正文 数据库是信息化产业的最基础的软件之一,各种管理系统,网站,在线游戏,背后基本都会有数据库的支持. 回到顶部 mysql基础 ...
- 在Java中,return null 是否安全, 为什么?
Java代码中return value 为null 是不是在任何情况下都可以,为什么不会throw NullPointerException? Java语言层面:null值自身是不会引起任何问题的.它 ...
- 函数的引用透明性(referential transparency)
1. 基础 初学程序设计时,比较容易混淆的两个概念是数学函数(math function)和程序中使用的函数. 在数学函数中 y=f(x),一个输入值有固定的输出值.例如,无论计算多少次,sinπ 的 ...
- Android中Activity切换时共享视图元素的切换动画(5.0以上)
同一时候公布在我的博客 点此进入 背景 说来这个的背景很easy,常常在使用图片列表的时候就会想,假设"列表中的图片放大到整个屏幕"作为 Activity 的补间动画.就很完美了. ...
- 手把手教你----MyEclipse中 配置 Tomcat
电脑上配置Tomcatserver 安装Tomcat并配置环境变量 測试是否配置成功 MyEclipse中配置Tomcat 想要开发Java Web的程序.首先在MyEclipse中必须配置Tomca ...
- 为什么一款优秀的移动工具类应用必须开发PCclient?
移动大潮气势汹汹,PC端似乎已经一条腿跨进了坟墓. 作为一个windows开发者.难免有些焦灼. windows真的已死吗?真的无用武之地了吗? 或许是人云亦云吧. 突然看到了这篇文章,感触颇深. 文 ...
- Java反射学习总结四(动态代理使用实例和内部原理解析)
通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...
- ZOJ 1796 Euchre Results 数学水题
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1796 题意: 四个人玩游戏,已知三个人的输赢情况,求第四个人的输赢情况. ...
- 小米笔记本(13.3 I7) ubuntu14.04下网卡驱动安装
ubuntu 内核升级到4.6.4(更高版本可能造成系统无法启动) kernel debian包下载地址 http://kernel.ubuntu.com/~kernel-ppa/mainline/v ...