java基础---->java多线程的使用(十)
这里介绍一下java中关于线程状态的知识,主要通过代码演示各种状态出现的时机。少年时我们追求激情,成熟后却迷恋平庸,在我们寻找,伤害,背离之后,还能一如既往的相信爱情,这是一种勇气。每个人都有属于自己的一片森林,迷失的人迷失了,相逢的人会再相逢。
java多线程的状态
在java1.5中,Thread.State枚举类包含了线程的所有状态。以下是jdk关于线程的几种状态的说明:
1、NEW:A thread that has not yet started is in this state. 2、RUNNABLE:A thread executing in the Java virtual machine is in this state. 3、BLOCKED:A thread that is blocked waiting for a monitor lock is in this state. 4、WAITING:A thread that is waiting indefinitely for another thread to perform a particular action is in this state. 5、TIMED_WAITING:A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state. 6、TERMINATED:A thread that has exited is in this state.
以下我们通过代码来看一下各个状态切换出现的场景。
一、NEW、RUNNABLE、TERMINATED状态
package com.linux.huhx.thread3.threadState_1; /**
* @Author: huhx
* @Date: 2017-10-31 下午 2:44
* State: NEW, RUNNABLE, TERMINATED
*/
public class StateRun1 {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
System.out.println("name " + Thread.currentThread().getName() + " 1 " + myThread.getState()); // name main 1 NEW
Thread.sleep(1000);
myThread.start();
Thread.sleep(1000);
System.out.println("name " + Thread.currentThread().getName() + " 2 " + myThread.getState()); // name main 2 TERMINATED
}
} class MyThread extends Thread { public MyThread() {
System.out.println("name " + Thread.currentThread().getName() + " constructor " + Thread.currentThread().getState()); // name main constructor RUNNABLE
} @Override
public void run() {
System.out.println("name " + Thread.currentThread().getName() + " run method " + Thread.currentThread().getState()); // name Thread-0 run method RUNNABLE
}
}
/*
name main constructor RUNNABLE
name main 1 NEW
name Thread-0 run method RUNNABLE
name main 2 TERMINATED
*/
二、TIMED_WAITING状态
package com.linux.huhx.thread3.threadState_1; /**
* @Author: huhx
* @Date: 2017-10-31 下午 2:51
* STATE: TIMED_WAITING
*/
public class StateRun2 { public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(1000);
System.out.println("main " + myThread.getState()); // main TIMED_WAITING
} static class MyThread extends Thread {
@Override
public void run() {
try {
System.out.println("begin sleep.");
Thread.sleep(10 * 1000);
System.out.println("end sleep." + Thread.currentThread().getState()); // RUNNABLE
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/*
begin sleep.
main TIMED_WAITING
end sleep.RUNNABLE
*/
三、TIMED_WAITING, BLOCKED状态
package com.linux.huhx.thread3.threadState_1; import java.util.concurrent.TimeUnit; /**
* @Author: huhx
* @Date: 2017-10-31 下午 2:57
* STATE: TIMED_WAITING, BLOCKED
*/
public class StateRun3 { public static void main(String[] args) throws InterruptedException {
Thread1 threadA = new Thread1();
threadA.setName("A");
threadA.start(); Thread2 threadB = new Thread2();
threadB.setName("B");
threadB.start(); TimeUnit.SECONDS.sleep(2);
System.out.println("In main threadB " + threadB.getState());
System.out.println("In main threadA " + threadA.getState());
} static class Thread1 extends Thread {
@Override
public void run() {
Service.serviceMethod();
}
} static class Thread2 extends Thread {
@Override
public void run() {
Service.serviceMethod();
}
}
} class Service {
public synchronized static void serviceMethod() {
try {
System.out.println(Thread.currentThread().getName() + " enter service method.");
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*
A enter service method.
In main threadB BLOCKED
In main threadA TIMED_WAITING
B enter service method.
*/
四、WAITING状态
package com.linux.huhx.thread3.threadState_1; import com.linux.huhx.thread2.ThreadB; /**
* @Author: huhx
* @Date: 2017-10-31 下午 3:11
* STATE: WAITING
*/
public class StateRun4 {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(1000);
System.out.println("In main thread state: " + myThread.getState()); // WAITING new MyThreadB().start();
} static class Lock {
public static final Byte lock = new Byte("0");
} static class MyThread extends Thread {
@Override
public void run() {
try {
synchronized (Lock.lock) {
System.out.println("before wait: " + Thread.currentThread().getState()); // RUNNABLE
Lock.lock.wait();
System.out.println("after wait: " + Thread.currentThread().getState()); // RUNNABLE
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} static class MyThreadB extends Thread {
@Override
public void run() {
synchronized (Lock.lock) {
Lock.lock.notify();
}
}
}
}
/*
before wait: RUNNABLE
In main thread state: WAITING
after wait: RUNNABLE
*/
友情链接
java基础---->java多线程的使用(十)的更多相关文章
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...
- Java基础技术多线程与并发面试【笔记】
Java基础技术多线程与并发 什么是线程死锁? 死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去,我们就可以称 ...
- Java基础-Java中23种设计模式之常用的设计模式
Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...
- java基础---->java中正则表达式二
跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...
- Java基础-Java中的堆内存和离堆内存机制
Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Java基础-Java中的内存分配与回收机制
Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.
- Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)
Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...
- Java基础-Java中的并法库之线程池技术
Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- Java基础-Java数据类型
Java基础-Java数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据类型的作用 数据类型就是一组值,以及这一组值上的操作,数据类型可以决定数据的存储方式,取值范围 ...
随机推荐
- 架构 : 三层架构、MVC、MVP、MVVM
1. 三层架构 将整个业务应用划分为:界面层(User Interface layer, UIL).业务逻辑层(Business Logic Layer, BLL).数据访问层(Data acce ...
- (https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014550004)Topic: Caught java.io.CharConversionException. ERRORCODE=-4220, SQLSTATE=null
270002WDPN 3 Posts 0 people l ...
- 经典炫酷的HTML5/jQuery动画应用示例及源码
jQuery是一款普遍受前端开发者欢迎的Javascript框架,但是开发者貌似更关注jQuery开发的插件,海量的jQuery插件让前端开发者非常方便.HTML5的加入让jQuery这个家族更加丰富 ...
- Linux学习笔记<五>——<Shell部分>
管道命令(pipe) 1.把一个命令的输出作为另一个命令的输入 ls -al /etc | less 2.选取命令:cut和grep cut命令可以将一段消息的某段切出来. -d接分隔符,-f是取出第 ...
- Java对象序列化给分布式计算带来的方便
什么时候使用序列化: 一:对象序列化可以实现分布式对象.主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样.二:对象序列化不仅保留一个对象的数据,而且递归保存对象引 ...
- 【玩转Golang】reflect.DeepEqual
如果有两个map,内容都一样,只有顺序不同 m1:=map[,,}; m2:=map[,,}; 我们怎么判断二者是否一致呢? 如果你打算这么写: fmt.Println("m1==m2&qu ...
- 内存管理 初始化(八) 至kswapd_init
至此,内存初始化部分已看完,遗留问题: 1.对于unicore或者mips的页表建立都很清楚,但是对于ARM我不清楚: 初始化部分涉及的页表映射建立,我都以unicore架构为准,ARM的页表映射从原 ...
- Android学习之——实现圆角Button
在drawable文件夹下新建btn_shape.xml文件: <?xml version="1.0" encoding="utf-8"?> < ...
- 5 JInja2模版(适用于Django和Flask)
模版 在生产环节下,我们要把后端程序(其实就是python)计算出来的数据和html页面结合起来做,这个时候模版就派上大用处了. Flask下的模版---Jinja2 Jinja是日本寺庙的意思,并且 ...
- 土办法 填充NAS空间
最近需要把一个1.8TB的NAS 塞满,网上东拼西凑,找了个办法 写脚本,然后保存为tt40.sh, 并上传到NAS中. #!/bin/sh echo "space2->space11 ...