3. 多线程5个线程的状态

电脑杂谈  发布时间:2020-06-15 18:13:48  来源:网络整理

什么导致线程阻塞_android 阻塞线程_多线程阻塞状态

线程状态

一个多线程阻塞状态,线程的五个主要状态

新状态

创建Thread类的实例(对象)时,该线程进入新状态(未启动). 例如: 线程t1 =新的Thread().

操作状态(就绪状态):

多线程阻塞状态_什么导致线程阻塞_android 阻塞线程

创建线程对象后,其他线程(例如主线程)将调用该对象的start方法. 处于此状态的线程在可运行线程池中,等待线程调度选择它们以获取cpu使用权限. 例如: t1.start().

以下条件将进入操作状态:

运行状态

线程获取CPU资源并正在执行任务(#run()方法). 此时,除非该线程自动放弃CPU资源或进入更高优先级的线程,否则该线程将一直运行到结束.

阻止状态:

什么导致线程阻塞_android 阻塞线程_多线程阻塞状态

由于某种原因,正在运行的线程放弃CPU并挂起其执行多线程阻塞状态,即进入阻塞状态. 程进入可运行状态之前,有机会再次获得CPU资源并进入运行状态.

有4种阻止情况:

死亡状态

当线程完成执行或被另一个线程杀死时,该线程进入死状态,然后该线程无法进入就绪状态并等待执行.

有4种死亡类型:

什么导致线程阻塞_android 阻塞线程_多线程阻塞状态

第二个模拟线程状态

1. 模拟睡眠阻塞状态

package com.hello.state;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 倒计时,模拟网络阻塞
 */
public class BlockSleep03 {
    public static void main(String[] args) throws InterruptedException {
        // 倒计时10s,所以加10s
        Date endDate = new Date(System.currentTimeMillis()+1000*10);
        long end = endDate.getTime();
        while (true) {
            System.out.println(new SimpleDateFormat("mm:ss").format(endDate));
            Thread.sleep(1000);
            endDate = new Date(endDate.getTime() - 1000);
            if (end - 10000 > endDate.getTime()) {
                break;
            }
        }
    }
}

2. 模拟死亡状态[外部干预]

package com.hello.state;
/**
 * 模拟:终止线程
 * 1、正常结束
 * 2、外界干预
 * 不要使用stop、destroy方法
 */
public class TerminateThread implements Runnable{
    // 定义一个标志位
    private boolean flag = true;
    private String name;
    public TerminateThread(String name) {
        this.name = name;
    }
    @Override
    public void run() { // 运行状态
        int i=0;
        while (flag){
            System.out.println(name +"--->"+i++);
        }
    }
    public void terminate() {
        this.flag = false;
    }
    public static void main(String[] args) {
        TerminateThread tt = new TerminateThread("CC");
        new Thread(tt).start();// 新生状态->就绪状态
        for (int i=0; i<99; i++) {
            if (i==88){
                tt.terminate(); // 结束状态
                System.out.println("线程终止");
            }
            System.out.println("main--->"+i);
        }
    }
}

多线程阻塞状态_android 阻塞线程_什么导致线程阻塞

3. 模拟收益线程礼貌

package com.hello.yield;
/**
 * yield礼让线程,暂停线程直接进入就绪状态
 */
public class YieldDemo02 {
    public static void main(String[] args) {
       new Thread(()->{
           for(int i=0; i<20; i++) {
               if (i%5==0) {
                   Thread.yield(); // 线程礼让
               }
               System.out.println("lambda-------" + i);
           }
       }).start();
        for(int i=0; i<20; i++) {
            System.out.println("main------"+i);
        }
    }
}

4. 模拟加入线程以切入行

package com.hello.join;
/**
 * join 插队线程
 */
public class JoinDemo01 {
    public static void main(String[] args) throws InterruptedException {
       Thread t = new Thread(()->{
           for(int i=0; i<100; i++) {
               System.out.println("lambda-------" + i);
           }
       });
               t.start();
        for(int i=0; i<100; i++) {
            if (i==20) {
                t.join(); // 插队,main被阻塞
            }
            System.out.println("main------"+i);
        }
    }
}

参考:

芋头源代码


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-246477-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 张宝琪
        张宝琪

        濒海战斗舰也就是反恐和特种作战用的

      • 田为
        田为

        自己都想推翻萨达姆

      • 孙改玲
        孙改玲

        好期待台宣独

      热点图片
      拼命载入中...