Thread常用方法的使用(二)下

简介: Thread常用方法的使用(二)

八. 线程的强制执行 join()


让这个线程强制最先执行。


 //线程的 join 方法
    @Test
    public void joinTest() throws Exception{
        JoinRunnable joinRunnable=new JoinRunnable();
        Thread thread=new Thread(joinRunnable);
        //启动
        thread.start();
        // 主线程有10个,副线程100个,按理是 main先执行完, 加入了 join之后,强制让副线程先执行完。
        for(int i=0;i<10;i++){
            //让当前线程死掉.
            if(i==8){
                //当运行8后, 让 thread线程强制运行,即到 i=8了,不运行了,让 其他线程运行了。
                // 保证 i=8,i=9 最后输出。
                thread.join();
            }
            System.out.println("当前线程:"+Thread.currentThread().getName()+"运行到:"+i);
        }
    }
    class JoinRunnable implements  Runnable{
        @Override
        public void run() {
            for(int i=0;i<100;i++){
                System.out.println("输出内容:"+Thread.currentThread().getName()+",运行到:"+i);
            }
        }
    }


运行程序, 查看控制台输出:


20200619163214254.png


九. 线程的暂时挂起,不执行 yield()


注意, yield() 方法,只是让此线程释放资源,不执行,但不能保证最后执行。 可以线程 i=8时,得到了资源, 然后判断了i>=7, 执行 .yield() 方法,释放资源, 忽然它又得到了资源, 那么i=8 就会运行了。 不像 join()那样强制。


   @Test
    public void yieldTest() throws Exception{
        YieldRunnable yieldRunnable=new YieldRunnable();
        Thread thread=new Thread(yieldRunnable);
        //启动
        thread.start();
        for(int i=0;i<100;i++){
            System.out.println("当前线程:"+Thread.currentThread().getName()+"运行到:"+i);
        }
    }
    class YieldRunnable implements  Runnable{
        @Override
        public void run() {
            Thread thread=Thread.currentThread();
            for(int i=0;i<10;i++){
                if(i>=7){
                    //级别设置小点, 让其不执行。
                    thread.setPriority(Thread.MIN_PRIORITY);
                    Thread.yield();
                }
                System.out.println("输出内容:"+thread.getName()+",运行到:"+i);
            }
        }
    }


运行程序,查看控制台输出


20200619163220840.png


这儿的 i=7,i=8,i=9 就得到了资源,执行了,而不是强制最后执行。


十. 打断休眠 interrupt()


主要用于 打断 休眠。


@Test
    public void interTest() throws Exception{
        InterruptRunnable interruptRunnable=new InterruptRunnable();
        Thread thread=new Thread(interruptRunnable);
        //启动
        thread.start();
        //休眠两秒
        Thread.sleep(2000);
        //两秒之后,进行打断, 副线程应该还在休眠的状态上。
        thread.interrupt();
        Thread.sleep(5000);
    }
    class InterruptRunnable implements  Runnable{
        @Override
        public void run() {
            System.out.println("开始进行休眠");
            try {
                Thread.sleep(5000);
                System.out.println("休眠结束");
            } catch (InterruptedException e) {
                System.out.println("休眠被打断");
            }
            System.out.println("退出休眠");
        }
    }


运行程序,


20200619163228541.png


十.一 设置停止和重启


以前 是有 stop() 这样的方法的,后来被抛弃了, 用标志位进行设置关闭和启动。


class MyRunnableDemo implements Runnable{
    private boolean isRun=true;
    @Override
    public void run() {
        //定义此标识位
            while(isRun){
                try {
                    Thread.sleep(30);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("打印输出");
            }
    }
    //通过标识位进行相应的控制
    public void stop(){
        this.isRun=false;
    }
    public void restart(){
        this.isRun=true;
        run();
    }
}
public class StopDemo {
    public static void main(String[] args) {
        MyRunnableDemo myRunnableDemo=new MyRunnableDemo();
        Thread thread=new Thread(myRunnableDemo);
        System.out.println("开始启动");
        thread.start();
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        myRunnableDemo.stop();
        System.out.println("停止");
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("重新启动");
        myRunnableDemo.restart();
    }
}


运行程序,查看控制台。


20200619163405980.png


这就是 Thread 类的常用方法,必须要掌握使用。


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关文章
|
3月前
|
算法 Java 调度
深入理解 Thread 类的 Yield 方法
【8月更文挑战第22天】
128 4
【多线程面试题 二】、 说说Thread类的常用方法
Thread类的常用方法包括构造方法(如Thread()、Thread(Runnable target)等)、静态方法(如currentThread()、sleep(long millis)、yield()等)和实例方法(如getId()、getName()、interrupt()、join()等),用于线程的创建、控制和管理。
|
6月前
|
安全 Java 开发者
AtomicInteger 类常用方法介绍
AtomicInteger 类常用方法介绍
41 1
|
Java 调度
Thread常用方法
Thread常用方法
61 0
Thread 类的基本用法
比较推荐:使用 lambda 表达式创建线程的时候不用重写 run 方法。 不需要显式重写run方法的原因是因为线程的目标方法已经在Lambda表达式中定义了。Lambda表达式是一种用于创建匿名函数的语法糖,它可以将一个方法(或一段代码块)包装为一个函数对象。当您使用Lambda表达式创建线程时,Lambda表达式的内容会被视为线程执行的任务,这个任务会自动成为run方法的实现。
78 0
|
Java 调度
Thread类的方法
Thread类的方法
41 0
|
调度
Thread 类的基本方法
Thread 类的基本方法
84 0
测试Thread中的常用方法
测试Thread中的常用方法
69 0