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学习总结---函数使用 and 装饰器
# 函数使用 ### 零碎知识 - 灵活的if-else ```python a = 3 if False else 5 print(a) ''' if False: a = 3 else: a = ...
- JavaSE复习(一)继承多态与常用API
继承与多态 在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式: 直接通过子类对象访问成员变量:等号左边是谁,就优先用谁,没有则向上找 间接通过成员方法访问成员变量:该方法属于 ...
- poj1273 网络流入门题 dinic算法解决,可作模板使用
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62078 Accepted: 2384 ...
- HDU 1532 基础EK Drainage Ditches
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- J2EE的十三种技术——JNDI
背景: 上一篇博客中介绍了J2EE的十三种技术之一--JDBC,主要用于提供了统一访问多种数据库的方式.这篇文章我们继续介绍J2EE的技术--JNDI. JNDI: Java Naming and D ...
- user namespace 2
昨天又试了一下, echo 0 1000 1 > /proc/<PID>/uid_map 想着直接把一个进程的uid设置成root,这样他就可以在自己的user namespace ...
- P3153 [CQOI2009]跳舞
题目描述 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会”单向喜欢“) ...
- Linux系统——28个命令行下的工具
Unix/Linux下的28个命令行下的工具 下面是Kristóf Kovács收集的28个Unix/Linux下的28个命令行下的工具(原文链接),有一些是大家熟悉的,有一些是非常有用的,有一些是不 ...
- idiots
idiots 题目描述 给定 $n$ 个长度分别为 $a_i$ 的木棒,问随机选择 $3$ 个木棒能够拼成三角形的概率. 输入格式 第一行一个正整数 nn. 第二行 nn 个正整数,第 ii 个数表示 ...
- 转:Java SoftReference 使用构建对象缓存
本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说, ...