码迷,mamicode.com
首页 > 编程语言 > 详细

外部终止线程及阻塞

时间:2019-07-26 19:03:42      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:http   text   ima   执行   dem   test   调度   sleep   字符串   

一、外部终止线程

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

效果

技术图片

 

外部终止线程及阻塞

标签:http   text   ima   执行   dem   test   调度   sleep   字符串   

原文地址:https://www.cnblogs.com/ssxblog/p/11252082.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!