zoukankan      html  css  js  c++  java
  • 外部终止线程及阻塞

    一、外部终止线程

    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;
                }
            }
        }
    }

    效果

  • 相关阅读:
    HUD 1284 钱币兑换问题
    HUD 1284 钱币兑换问题
    HDU 1283 最简单的计算机
    HDU 1283 最简单的计算机
    商品搜索引擎---推荐系统设计
    Spark机器学习:TF-IDF实例讲解
    【读书笔记】Elasticsearch集成Hadoop最佳实践
    Java面试题集合
    Spring Boot企业微信点餐系统-第一章-课程介绍
    Eclipse下svn的创建分支/合并/切换使用
  • 原文地址:https://www.cnblogs.com/ssxblog/p/11252082.html
Copyright © 2011-2022 走看看