• 外部终止线程及阻塞


    一、外部终止线程

    1)线程类中 定义  线程体使用的标识

    2)线程体使用该标志

    3)对外提供方法,改变标识

    4)外部干涉,根据条件终止线程

    package cn.thread;
    
    public class Demo01 {
        public static void main(String[] args) {
            Study s=new Study();
            Thread t=new Thread(s);
            t.start();
            //外部干涉,根据条件终止线程
            for(int i=0;i<100;i++) {
                if(i==50) {
                    s.stop();
                }
                System.out.println("线程停止"+i);
            }
            
        }
    }
    class Study implements Runnable{
        //1)线程类中 定义  线程体使用的标识
        private boolean flag=true;
        
        @Override
        public void run() {
            //2)线程体使用该标志
            while(flag) {
                System.out.println("start ....Thread");
            }
            
        }
        //3)对外提供方法,改变标识
        public void stop() {
            this.flag=false;
        }
    }

    二、阻塞线程

    1、join  :合并线程

    2、yield:暂停自己的线程   static

    3、sleep

    join实现   (条件成立时,会执行当前线程,从而使主线程停滞,线程执行完后,再执行主线程,从而达到阻塞目的)

    JoinDemo01.java   

    package cn.thread;
    /*
     * join 合并线程
     */
    public class JoinDemo01 extends Thread{
        public static void main(String[] args) throws InterruptedException {
            JoinDemo01 demo=new JoinDemo01();
            Thread t=new Thread(demo);   //新生
            t.start();  //就绪
            //cpu调度 运行    
            for(int i=0;i<100;i++) {
                if(i==50) {
                    t.join();   //main 阻塞。。。  
                }
                System.out.println("main...."+i);
            }
        }
        @Override
            public void run() {
                for(int i=0;i<100;i++) {
                    System.out.println("join...."+i);
                }
            }
    }

    yield实现     (yield()方法放在哪就阻塞谁,如果放在主线程里就阻塞主线程,等其他线程运行完,再执行主线程)

    YieldDemo01.java

    package cn.thread;
    
    public class YieldDemo01 extends Thread {
        public static void main(String[] args) {
            YieldDemo01 y=new YieldDemo01();
            Thread t=new Thread(y);
            y.start();
            
            for(int i=0;i<100;i++) {
                if(i%20==0) {
                    //暂停本线程 main
                    t.yield();
                }
                System.out.println("main... "+i);
            }
        }
        @Override
        public void run() {
            for(int i=0;i<100;i++) {
                System.out.println("Yield... "+i);
            }
        }
        
    }

    sleep模拟倒计时

    SleepDemo01.java 
    package cn.thread;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /*
     * 倒计时
     * 1、倒数10个数,一秒钟打印一个
     * 2、倒计时
     */
    public class SleepDemo01 {
        public static void main(String[] args) throws InterruptedException {
            Date endtime=new Date(System.currentTimeMillis()+10*1000);
            long end=endtime.getTime();
            while(true) {
                //输出
                System.out.println(new SimpleDateFormat("mm:ss").format(endtime));  //format格式化为字符串
                //构建下一秒的时间
                endtime=new Date(endtime.getTime()-1000);
                Thread.sleep(1000);
                //十秒以内 继续  否则退出
                if(end-10000>endtime.getTime()) {
                    break;
                }
            }
        }
        public static void test01() throws InterruptedException {
            int num=10;
            while(true) {
                System.out.println(num);
                Thread.sleep(1000);
                num--;
                if(num<0) {
                    break;
                }
            }
        }
    }

    效果

  • 相关阅读:
    RAID介绍,RAID5,10制作与损坏恢复
    ELK 安装过程
    centos 系统 yum安装软件报错
    linux系统磁盘分区
    python实现遍历两个文件夹,比对文件异常,生成比对报告功能
    win10新装系统,显卡风扇转动,链接正常开机,但设备管理器如果显示,无法更新驱动
    navicat premium 破解,无限试用方法
    安装vmware workstations 12 +ubuntu 遇到的一些问题
    win10 如何打开telnet,ftp等服务
    linux集群架构-keepalived高可用
  • 原文地址:https://www.cnblogs.com/ssxblog/p/11252082.html
Copyright © 2020-2023  润新知