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创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
随机推荐
- centos下vsftpd登录后无法看见文件,无法创建文件及文件夹
centos下vsftpd不能显示文件,不能创建文件及文件夹 这是由于selinux的机制 运行如下命令查看: [root@SZCLC6X-AMP-4393 www]# getsebool -a|gr ...
- Windows 下开发.NET Core应用
一.使用Visual Studio 2015开发1.1 依次安装Visual Studio 2015 Update 3.NET Core 1.0.0 - VS 2015 Tooling Preview ...
- 【现代程序设计】homework-02
迟交了这么久,一定是0分了.可是我再怎么挣扎,还是不会.交了一维和二维的,这里说说思路吧.. 对于二维的情况,主要的思路就是将二维数组求矩形最大子数组的情况转化为一维的情况.因为所求的是矩形,我们就可 ...
- BETA(1)
目录 组员情况 组员1(组长):胡绪佩 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团 ...
- Linux下性能测量和调试诊断工具Systemtap
一.简介 SystemTap是一个诊断Linux系统性能或功能问题的开源软件.它使得对运行时的Linux系统进行诊断调式变得更容易.更简单.有了它,开发者或调试人员不再需要重编译.安装新内核.重启动等 ...
- Android使用adb命令查看CPU信息
Android中使用JNI编程的时候会需要编译出不同的SO文件,以供适配不同的机型. 例如: 由此需要查看不同机型的CPU信息. 使用ADB命令查看CPU信息命令如下: 1. adb shell 2. ...
- 【POJ 2976 Dropping tests】
Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 13849Accepted: 4851 Description In a certa ...
- 7月13号day5总结
今天学习过程和小结 使用伪分布式进行大数据计算,计算气象站记录气温的平均值 weather map()方法,key值数据多所以用LongWritable,value值是string类型,string类 ...
- ES6特性以及代码demo
块级作用域let if(true){ let fruit = ‘apple’; } consoloe.log(fruit);//会报错,因为let只在if{ }的作用域有效,也就是块级作用域 恒量co ...
- 汕头市队赛 SRM 07 A 你的麻将会排序吗
A 你的麻将会排序吗 SRM 07 曾经有过一些沉迷日麻的小孩纸,后来呀,他们都去寻找自己的世界了. kpm也是这样的小孩纸.他想有一只自动整理牌的机器.当麻将以给定的顺序进入机器时,通过机器的运转, ...