Java多线程-02-线程状态
目录
一.线程简介
二.线程创建
三.线程状态
四.线程同步
五.线程协作
三.线程状态
介绍
五大状态


线程方法

线程停止_sleep

//1.建议线程正常停止
//2.如果要强制停止,自己设置一个外部标志位控制(不要使用Java自带的方法)
public class Stop_Test {
public static void main(String[] args) {
Load load_01 = new Load();
new Thread(load_01).start();
for (int i = 0; i < 10000; i++) {
//在i等于9900时 停止myThread线程
if(i==9900) load_01.stop();
System.out.println("main线程---"+i);
}
System.out.println("main线程---自然停止");
}
}
class Load implements Runnable{
//标志位
private boolean flag = true;
@Override
public void run() {
int i = 0;
while (flag){
System.out.println("Load线程---"+i++);
}
}
//设置一个公开的停止方法
public void stop(){
flag = false;
System.out.println("Load线程---非自然停止");
}
}
线程礼让_yield
正常的情况
package 线程状态;
public class Yield_Test {
public static void main(String[] args) {
MyYeild myYeild = new MyYeild();
for (int i = 0; i < 10; i++) {
new Thread(myYeild,Integer.toString(i)).start();
}
}
}
class MyYeild implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "-->开始");
System.out.println(Thread.currentThread().getName() + "-->结束");
}
}
礼让的情况
public class Yield_Test {
public static void main(String[] args) {
MyYeild myYeild = new MyYeild();
for (int i = 0; i < 10; i++) {
new Thread(myYeild,Integer.toString(i)).start();
}
}
}
class MyYeild implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "-->开始");
//这里写个循环并不是正规操作
//只是因为礼让有可能不成功,礼让一100次多半会成功,方便观察现象
//每个线程都在输出了 “开始” 后礼让100次
//即在输出 “结束" 之前所有的线程都会相互礼让
//即先被cpu调度的线程在输出 “开始” 后会礼让后被cpu调度的线程
for (int i = 0; i < 10000; i++) {
Thread.yield();
}
System.out.println(Thread.currentThread().getName() + "-->结束");
}
}
线程强制执行_join

public class Join_Test {
public static void main(String[] args) throws InterruptedException {
//开启线程
MyJoin myJoin = new MyJoin();
Thread vipThread = new Thread(myJoin);
vipThread.start();
for (int i = 0; i < 5; i++) {
System.out.println("main-->"+i);
if(i == 2){
//强制执行vipThread
vipThread.join();
}
}
}
}
class MyJoin implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("VIPt-->"+i);
}
}
}
观测线程状态

public class State_Test {
public static void main(String[] args) {
Thread t = new Thread(()->{
//先睡5秒
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我刚才睡了5秒,现在醒了");
});
//观察启动前状态
Thread.State t_State = t.getState();
System.out.println(t_State);//NEW
//观察启动后状态
t.start();
t_State = t.getState();
System.out.println(t_State);//RUNNABLE
//在 t 线程退出前,main线程每隔1秒观察输出一下 t 线程的状态
while(t_State != Thread.State.TERMINATED){
//每轮循环睡1秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t_State = t.getState();//更新线程状态
System.out.println(t_State);//输出线程状态
}
}
}
线程优先级

优先级高的更可能先执行,但最终还是听cpu调度
一般情况下所有线程的优先级都默认是 5
package 线程状态;
public class Priority_Test {
public static void main(String[] args) {
//输出主线程Main的优先级
System.out.println(Thread.currentThread().getName() + "-->" + Thread.currentThread().getPriority());
MyPriority myPriority = new MyPriority();
Thread t1 = new Thread(myPriority,"线程1");
Thread t2 = new Thread(myPriority,"线程2");
Thread t3 = new Thread(myPriority,"线程3");
Thread t4 = new Thread(myPriority,"线程4");
//先设置优先级,再启动
t1.setPriority(Thread.MIN_PRIORITY);//MIN_PRIORITY = 1
t2.setPriority(2);
t3.setPriority(Thread.NORM_PRIORITY);//NORM_PRIORITY = 5
t4.setPriority(Thread.MAX_PRIORITY);//MAX_PRIORITY = 10
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class MyPriority implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "-->" + Thread.currentThread().getPriority());
}
}
并不是按照我们设定的优先级执行
原因
1.最终还是要听cpu的调度
2.可能和我的电脑是多核cpu有关,有8个核心(具体影响和关系不清楚),也许此时5条线程不用等待一个核心的调度,直接5各跑一条线程,所以优先级的设置没什么影响,当然了这只是猜测
守护线程

一个有趣的例子
如何用代码表示我的存在只为守护你?(你离开以后我也将消失)
//如何用代码表示我的存在只为守护你?(你离开以后我也将消失)
public class Daemon_Test {
public static void main(String[] args) {
PersonB you = new PersonB(36000);
PersonA I = new PersonA();
Thread Your_world = new Thread(you);
Thread My_world = new Thread(I);
//默认为 false 表示用户线程
//守护线程将在用户线程结束一段时间之后结束
My_world.setDaemon(true);
Your_world.start();
My_world.start();
}
}
class PersonA implements Runnable{
@Override
public void run() {
while(true) System.out.println("我守护你");
}
}
class PersonB implements Runnable{
private int lifeTime;
public PersonB(int lifeTime){
this.lifeTime = lifeTime;
}
@Override
public void run() {
System.out.println("Hello world!");
for (int i = 1; i <=lifeTime; i++) System.out.println("我在世界的第"+i+"天");
System.out.println("Goodbye world!");
}
}

三.线程状态
浙公网安备 33010602011771号