外部终止线程及阻塞

Posted ssxblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外部终止线程及阻塞相关的知识,希望对你有一定的参考价值。

一、外部终止线程

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;
            
        
    

效果

技术图片

 

以上是关于外部终止线程及阻塞的主要内容,如果未能解决你的问题,请参考以下文章

加入线程(阻塞调用线程直到线程终止)和普通函数调用有啥区别

终止线程c ++ 11在读取时阻塞

如何立即终止套接字 IO 操作上的线程阻塞?

4.如何终止线程

pthread_kill()vs pthread_cancel()终止阻塞I / O的线程

java多线程--中断线程