今日内容的定义和例子我几乎是对照着课程一起同步记录的,所以内容大相径庭,这篇就先不标榜原创了。
今天学习了的主要内容:
1.线程状态解析
2.线程的状态
3.线程的中断
4.线程停止
5.守护线程
线程状态解析:
新创建状态(new):使用new创建一个新的线程对象,但是尚未调用start()方法。
可运行状态(Runnable):一旦线程调用了start()方法就为可运行,但是这只能说明该线程目前
是出于能够运行的状态并不已经是在运行的状态。
阻塞状态(blocked):处于运行状态的线程,由于某些原因的阻碍,使他处于一段时间的停滞状态
一般是等待一个锁,以访问某个对象。
计时等待状态(Timed waiting):指的是在一个限定期内等待另一个线程来执行某一个动作的状态。
终止状态(dead):是指线程的正式结束,run()方法执行完毕后返回。
我们可以使用线程对象的getState()方法来获得线程的状态信息。
线程的状态:
1.处于阻塞状态的线程,一旦阻塞事件消失或者结束,线程将归为到“可运行状态”,而不是直接进入运行状态。
2.当线程处于“同步锁”状态时,即一个包含同步方法(用synchronized修饰)的线程被CPU调用,其他线程就
无法调用相同对象的同步方法。当一个线程在一个同步方法的内部,所有试图调用该方法的同实例的其他线程必须
等待该线程的结束。
线程的中断:
我们可以通过重置线程的标识位,来使得线程中断。
中断的相关方法:
1.void interrupted():向线程发出中断请求。
2.static boolean interrupted():测试当前线程是否被中断了,会将标识位设置为false。
3.boolean isInterrupted():测试线程是否被终止,并不会重置标志位。
如果要中断一个正在处于阻塞状态的线程时,它是会抛出“线程中断异常InterruptedException”的。
线程停止:
在开发中想使得一个线程停止的方式,不能使用他们的stop()方法。
应该使用表示变量来停止一个线程;就如同设置一个开关一样,传递一个关闭的指令,线程收到这个信号之后
做出不再继续运行的响应。
守护线程:
守护线程是优先级别较低的一个默默提供后台服务的线程,若当没有一个线程来用到守护线程的服务的话,这个
守护线程就没有存在的必要了。
方法:
void setDaemon(boolean isDameon);
特点:
当线程只剩下守护线程时,JVM就退出。
InterruptedThreadDemo类(测试线程状态,判断线程中断):
package LessonForThread04;
import java.lang.Thread.State;
public class InterruptedThreadDemo
{
public static void main(String[] args)
{
//Lambda表达式
Thread t1 = new Thread(()->{
for (int i=0; i<10; i++)
{
System.out.println("t1 -- "+i);
try
{
Thread.sleep(200);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
});
State s1 = t1.getState();//获得t1状态值NEW
System.out.println(s1.name());
t1.start();
t1.interrupt();//请求t1线程中断。
boolean b1 = t1.isInterrupted();
System.out.println(b1);
//此时抛出了异常但是没有中断。
//很多情况下interrupt方法是没办法中断线程的。
State s2 = t1.getState();//获得t1状态值:RUNNABLE
System.out.println(s2.name());
//主线程代码
for (int i=0; i<10; i++)
{
System.out.println("main -- "+i);
try
{
Thread.sleep(300);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
KillToStopThread类(测试中断线程,守护线程):
package LessonForThread04;
class MyThread extends Thread
{
private boolean kill = false;
public void setKill(boolean kill)
{
this.kill = kill;
}
public void run()
{
int i = 0;
while (true)
{
if (kill == true)
{
break;
}
try
{
Thread.sleep(200);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(i++);
}
}
}
public class KillToStopThread
{
public static void main(String[] args)
{
MyThread mt1 = new MyThread();
mt1.setDaemon(true);//让mt1成为守护线程
mt1.start();
//此时,主线程只有一条语句就是休眠1.5秒,休眠期一过主线程就结束了,这时子线程就没有存在的必要了,
//此时JVM只剩下守护线程的时候守护线程就让JVM关闭了
try
{
Thread.sleep(1500);//先让主线程休息一秒钟,给mt1线程运行一秒钟之后再传入true
} catch (InterruptedException e)
{
e.printStackTrace();
}
mt1.setKill(true);
}
}
本篇部分文字来源于:
咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》
在这里十分感谢老师能够给我带来学习的激情。
2020.10.22
可以转载我的学习日记但请注明出处,谢谢。
本文章是本人学习笔记,不进行任何商用!也请别拿去商用!只为记录本人学习历程。
毕