线程状态
①线程停止
源代码:
package cn.ecut.state;
/*
①不推荐使用JDK提供的stop()、destroy()方法 (已废弃)
②推荐线程自己停止下来
③建议使用一个标志位进行变量flag=false,则终止线程运行。
*/
public class TestStop implements Runnable{
//定义线程停止的标识位
private boolean flag=true;
//重写run方法
@Override
public void run() {
int i=1;
//flag为true执行线程体方法
while(flag){
System.out.println("run-->"+i++);
}
}
//定义线程停止的方法,将标识位设为false
public void stop(){
this.flag=false;
}
//main方法
public static void main(String[] args) {
//静态代理开启线程
TestStop testStop=new TestStop();
new Thread(testStop).start();
//主线程方法体
for (int i = 1; i <200 ; i++) {
System.out.println("main-->"+i);
if(i==88){
//调用stop方法切换标识位,让线程停止
testStop.stop();
System.out.println("线程停止");
}
}
}
}
运行结果:
②线程休眠
例一:
源代码:
package cn.ecut.state;
/*
①sleep(时间) 指定当前线程阻塞的毫秒数;
②sleep存在异常 InterruptedException;
③sleep时间达到后线程进入就绪状态
④sleep可以模拟网络延时,倒计时等。
⑤每一个对象都有一把锁,sleep不会释放锁。
*/
//模拟倒计时 利用线程sleep方法
public class TestSleep {
public static void main(String[] args) {
try {
sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void sleep() throws InterruptedException {
int num=10;
while (true){
Thread.sleep(1000);
System.out.println(num--);
if(num<=0){
break;
}
}
}
}
运行结果:
例二:
源代码:
package cn.ecut.state;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;
public class TestSleep2 {
public static void main(String[] args) {
try {
sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void sleep() throws InterruptedException {
//定义计数器
int num=0;
//获取系统时间
Date startTime=new Date(System.currentTimeMillis());
while (true){
//每执行一次计数器加1
num++;
Thread.sleep(1000);
//改变日期格式
System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
//更新日期
startTime=new Date(System.currentTimeMillis());
//计数器等于10 停止
if(num==10){
break;
}
}
}
}
运行结果:
③线程礼让
源代码:
package cn.ecut.state;
/*
①礼让线程,让当前正在执行的线程暂停,但不阻塞。
②将线程从运行状态转化为就绪状态。
③让cpu重新调度,礼让不一定成功,看cpu心情。
*/
//测试线程礼让 礼让不一定成功
public class TestYield{
public static void main(String[] args) {
MyYield myYield=new MyYield();
new Thread(myYield,"a").start();
new Thread(myYield,"b").start();
}
}
class MyYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" start");
Thread.yield();
System.out.println(Thread.currentThread().getName()+" stop");
}
}
运行结果:
④线程强制执行
源代码:
package cn.ecut.state;
/*
①Join合并线程,待线程执行完成后,再执行其他线程,其他线程阻塞。
②可以想象成插队
*/
public class TestJoin implements Runnable{
@Override
public void run() {
for (int i = 1; i <100 ; i++) {
System.out.println("我是老大,我先来"+i);
}
}
public static void main(String[] args) throws InterruptedException {
//开启一个线程
TestJoin testJoin=new TestJoin();
Thread thread=new Thread(testJoin);
thread.start();
//主线程
for (int i = 1; i <100 ; i++) {
System.out.println("我是小弟"+i);
if(i==10){
thread.join();//插队 强制执行 此线程执行完之后,再执行其他线程,其他线程阻塞。
}
}
}
}
运行结果:
⑤线程状态
源代码:
package cn.ecut.state;
/*
Thread.State 线程状态
一共有六种结果,分别对应六种状态
①NEW 尚未启动的线程处于此状态
②RUNNABLE 在Java虚拟机中执行的状态处于此状态
③BLOCKED 被阻塞等待监视器锁定的线程处于此状态
④WAITING 正在等待另一个线程执行特定动作的线程处于此线程
⑤TIME_WAITING 正在等待另一个线程执行动作达到指定等待时间的线程处于此状态
⑥TERMINATED 已退出的线程处于此状态
*/
public class TestState {
public static void main(String[] args) {
Thread thread=new Thread(()->{
for (int i = 0; i <5 ; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("----------");
});
//①观察new之后线程的状态
Thread.State state = thread.getState();
System.out.println(state);
//②启动线程 观察start之后线程的状态
thread.start();
state = thread.getState();
System.out.println(state);
//③只要线程不停止,就一直输出状态
while(state!=Thread.State.TERMINATED){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
state=thread.getState();//更新
System.out.println(state);//打印
}
}
}
运行结果:
⑥线程的优先级
源代码:
package cn.ecut.state;
public class TestPriority {
public static void main(String[] args) {
MyPriority myPriority=new MyPriority();
Thread t1=new Thread(myPriority,"A线程");
Thread t2=new Thread(myPriority,"B线程");
Thread t3=new Thread(myPriority,"C线程");
Thread t4=new Thread(myPriority,"D线程");
Thread t5=new Thread(myPriority,"E线程");
Thread t6=new Thread(myPriority,"F线程");
//t1线程没有设置优先级 默认5
t1.start();
t2.setPriority(Thread.MAX_PRIORITY);
t2.start();
t3.setPriority(Thread.MIN_PRIORITY);
t3.start();
t4.setPriority(4);
t4.start();
t5.setPriority(7);
t5.start();
t6.setPriority(8);
t6.start();
//main线程默认优先级为 5
System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());
}
}
class MyPriority implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());
}
}
运行结果:
⑦守护线程
源代码:
package cn.ecut.state;
/*
测试守护线程
①线程分为守护线程和用户线程
②虚拟机必须确保用户线程执行完毕
③虚拟机不用等待守护线程执行完毕 例如操作日志,监控内存,垃圾回收等等
*/
public class TestDaemon {
public static void main(String[] args) {
You you=new You();
God god=new God();
Thread thread=new Thread(god);
thread.setDaemon(true);//默认为false 表示用户线程,一般的线程都是用户线程。
thread.start();
new Thread(you).start();
}
}
class You implements Runnable{
@Override
public void run() {
for (int i = 1; i <99 ; i++) {
System.out.println("我"+i+"岁了!");
}
System.out.println("拜拜!");
}
}
class God implements Runnable{
@Override
public void run() {
while(true){
System.out.println("我是上帝,我不会死!");
}
}
}
运行结果: