2.2多线程(java学习笔记)线程状态及线程操作的相关方法
一、线程的状态
线程一般具有五种状态,即创建、就绪、运行、阻塞、终止。
它们之间的关系:

二、线程操作相关方法
1.设置和取得线程名称。
如果不设置线程名称,系统会自动分配线程名,一般格式为Thread-Xx
获取当前线程用Thread.currentThread.getName();
线程名称的设置,Thread类中已经建好了各种构造器。

中间带有String的基本都是设置线程名称的,大家可以自行看下。
public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
Thread t2 = new Thread(s, "线程t2");
Thread t3 = new Thread(s);
t1.start();
t2.start();
t3.start();
}
}
class TestSleep implements Runnable{
public void run(){
for(int i = 0; i < 5; i++){
System.out.println(Thread.currentThread().getName() + " i:" + i );
}
}
}
运行结果:
线程t1 i:0
Thread-0 i:0
线程t2 i:0
Thread-0 i:1
线程t1 i:1
Thread-0 i:2
线程t2 i:1
Thread-0 i:3
线程t1 i:2
Thread-0 i:4
线程t2 i:2
线程t1 i:3
线程t1 i:4
线程t2 i:3
线程t2 i:4
2.判断线程是否启动
判断当前线程是否“”活着“”,可能大家对于线程活着这个定义不是很清楚。说明点就是线程启动了,而且也没有死亡就称之为活着。
public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
Thread t2 = new Thread(s, "线程t2");
System.out.println(t1.isAlive()); //false
System.out.println(t2.isAlive()); //false
t1.start();
System.out.println(t1.isAlive()); //ture
System.out.println(t2.isAlive()); //flase
t2.start(); //着这里加个延迟几秒就会发现下面会打印false。
System.out.println(t1.isAlive()); //这里的状态是不定的,假如指向到这t1和t2没有执行完,那么就是true
System.out.println(t2.isAlive()); //如果已经执行完毕进入死亡状态,这里就是false
}
}
class TestSleep implements Runnable{
public void run(){
for(int i = 0; i < 5; i++){
System.out.println(Thread.currentThread().getName() + " i:" + i );
}
}
}
false
false
true
false
true
true
线程t1 i:0
线程t1 i:1
线程t1 i:2
线程t1 i:3
线程t1 i:4
线程t2 i:0
线程t2 i:1
线程t2 i:2
线程t2 i:3
线程t2 i:4
当现场处于就绪状态和运行状态都是true,可能又会有疑问那处于堵塞状态了。
我们接下里就测试下处于堵塞状态下isAlive();
public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
Thread t2 = new Thread(s, "线程t2");
System.out.println(t1.isAlive());
System.out.println(t2.isAlive());
t1.start();
System.out.println(t1.isAlive());
System.out.println(t2.isAlive());
t2.start();
System.out.println(t1.isAlive());
System.out.println(t2.isAlive());
}
}
class TestSleep implements Runnable{
synchronized public void run(){
try {
this.wait(); //当前线程等待,即进堵塞状态
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i = 0; i < 5; i++){
System.out.println(Thread.currentThread().getName() + " i:" + i );
}
}
}
运行结果:
false
false
true
false
true
true
可以发现最后两个线程都堵塞了,但最后打印的状态还是true,处于堵塞状态的线程也是存活的。
3.线程的强制加入
public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
t1.start();
for(int i = 0; i < 10; i++){
if(i == 5){
try {
t1.join(); //当i为5时,强制加入线程t1
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + i);
}
}
}
class TestSleep implements Runnable{
synchronized public void run(){
for(int i = 0; i < 5; i++){
System.out.println(Thread.currentThread().getName() + " i:" + i );
}
}
}
main0
main1
main2
main3
main4
线程t1 i:0
线程t1 i:1
线程t1 i:2
线程t1 i:3
线程t1 i:4
main5
main6
main7
main8
main9
强制加入的线程运行完毕后才会让出资源。
4.线程的休眠
public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
t1.start();
}
}
class TestSleep implements Runnable{
synchronized public void run(){
for(int i = 0; i < 5; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " i:" + i );
}
}
}
sleep(填入的数字代表毫秒),上图中填入的是1000代表休眠1s,运行后我们会发现每隔一秒打印一次线程名+ i的值。
5.线程的中断。
可以使用interrupt()方法中断线程的运行。
public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
t1.start();
t1.interrupt();
}
}
class TestSleep implements Runnable{
public void run(){
System.out.println("开始休眠10s");
try {
Thread.sleep(10000);
System.out.println("完成休眠");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("当前线程被中断,休眠失败");
}
20 System.out.println("run正常运行结束");
}
}
如上代码没有被中断应是线程进入run中“开始休眠10s”,10s后会打印出“休眠完成”,"正常运行结束。"
运行我们会发现一运行就出现了“开始休眠10s”,"当前线程被中断,休眠失败",说明执行t1.interrupt()后t1线程被中断了执行。
运行结果:
开始休眠10s
当前线程被中断,休眠失败
6.线程的礼让
public class TestThread {
public static void main(String[] args) {
TestSleep s = new TestSleep();
Thread t1 = new Thread(s, "线程t1");
t1.start();
for(int i = 0; i < 10; i++){
if(i == 5){
System.out.println("开始礼让:");
Thread.currentThread().yield();
}
System.out.println(Thread.currentThread().getName() + i);
}
}
}
class TestSleep implements Runnable{
public void run(){
for(int i = 0; i < 5; i++){
System.out.println(Thread.currentThread().getName() + " i:" + i );
}
}
}
用yield()可以让当前线程暂停,暂时让其他线程来运行。
是暂时让一会不是一直让,只让一会就不让了,具体调度要看CPU。
运行结果:
main0
main1
main2
main3
main4
开始礼让:
线程t1 i:0
main5
main6
main7
main8
线程t1 i:1
main9
线程t1 i:2
线程t1 i:3
线程t1 i:4
2.2多线程(java学习笔记)线程状态及线程操作的相关方法的更多相关文章
- 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)
一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...
- Java学习笔记-基础语法Ⅹ-进程线程
学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...
- Java 学习笔记之 Stop停止线程
Stop停止线程: 使用stop()方法停止线程是非常暴力的,会抛出java.lang.ThreadDeath Error,但是我们无需显示捕捉, 以下捕捉只是为了看得更清晰. public clas ...
- Java 学习笔记之 Sleep停止线程
Sleep停止线程: 在Sleep状态下被interrupt,interrupted 状态会被擦除,返回false. 线程在Sleep状态下被interrupt: public class Sleep ...
- Java 学习笔记之 Return停止线程
Return停止线程: 使用interrupt()和return结合也可以实现停止线程的效果.不过还是建议使用“抛异常“的方法,因为在catch块中可以将异常向上抛,使线程停止的事件得以传播. pub ...
- Java 学习笔记 IO流与File操作
可能你只想简单的使用,暂时不想了解太多的知识,那么请看这里,了解一下如何读文件,写文件 读文件示例代码 File file = new File("D:\\test\\t.txt" ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- Java多线程技术学习笔记(二)
目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
随机推荐
- 孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5
孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5并学习权限设置 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十二天. 今天继续学习mongo ...
- 不作伪分享者决定完整分享我自学Python3的全部过程细节
不作伪分享者决定完整分享我自学Python3的全部过程细节 我不要作伪分享者 十六年前我第一次见到了电脑,并深深地爱上了它: 十二年前我第一次连上了网络,并紧紧地被它爱上. 十年前的网络是田园美景 ...
- python 由递归的dict构建树的画图代码
createPlot(mytree)方法实现. 其中myTree是一个字典,调用retrieveTree(0)可以获得一个字典的样式. Last login: Thu Feb 23 19:07:53 ...
- 使用BootStrapValidator来完成前端输入验证
BootStrapValidator可以用于完成基于BootStrap搭建的前端UI中的输入验证,由于本插件完全基于BootStrap因此可以和UI完美的融合在一起.下面直接上图,看看完成后的结果: ...
- table内容超出宽度时隐藏并显示省略标记
HTML中,一个表格,要达到二个条件: 1.内容多了不自动换行: 2.固定单元格宽度.如果内容超出,则隐藏: 如 果在IE下,只是写成<table style="table-layou ...
- REST Web 服务(一)----REST 介绍
1. 什么是REST? REST 定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的 Web 服务,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态. 2. REST的 ...
- 洛谷 P4514 上帝造题的七分钟 解题报告
P4514 上帝造题的七分钟 题目背景 裸体(裸题)就意味着身体(神题). 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了\(0\)的\(n \times m\)矩阵. 第二 ...
- 忽略node_modules目录
如上图所示添加node_modules目录到忽略文件列表里面,点击应用就可以了.
- 怎样把本地的jar包引入到maven工程里面
有些jar包在maven库里面查找不到,但是maven项目又有用到,此时最简单的方法就是把该jar包放到工程底下某个目录,然后在pom.xml里面配置dependency引入它. 具体如何操作呢? 假 ...
- android 跨进程通信
转自:http://www.androidsdn.com/article/show/137 由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一 ...