• 方法Join()


    • 等待线程结束:jion()
    • 谦让: yeild()
    • 睡眠: sleep()

    jion和sleep和yeild之间有什么区别呢?

    首先介绍一下jion():

    如果想让主线程等待子线程执行完毕之后再继续运行,比如线程处理一个数据,主线程想要获得这个线程的处理结果,因为线程之间是并行的,这个时候就需要用到jion()方法。方向jion()的作用就是等待线程对象销毁。

    先来看一段示例代码:

    public class MyThread extends Thread {
        @Override
        public void run(){
            try{
                int value = (int) (Math.random()*1000);
                System.out.println("i will sleep for "+value+" ms");
                Thread.sleep(value);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            try{
                MyThread thread = new MyThread();
                thread.start();
                thread.join();
                System.out.println("我想在上面的线程执行结束只会再执行,我成功了!");
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            System.out.println("================分割线=====================");
            MyThread myThread = new MyThread();
            myThread.start();
            System.out.println("我也想在上面的线程执行完毕之后执行!");
            System.out.println("但是我不知道应该sleep多久啊!");
            System.out.println("i failed...");
        }
    }

    放上执行结果:

    i will sleep for 436 ms
    我想在上面的线程执行结束只会再执行,我成功了!
    ================分割线=====================
    我也想在上面的线程执行完毕之后执行!
    但是我不知道应该sleep多久啊!
    i failed...
    i will sleep for 936 ms

    这里介绍一下join()的原理,方法jion()具有使线程排队运行的作用,有些类似同步的运行效果。jion和synchronized的区别是:join在内部使用wait()方法进行等待,而synchronized关键字使用对象监视器原理作为同步。

    划重点,因为join()使用了wait()所以,join是释放锁的!是释放锁的!

    这是join和sleep的主要区别!

    然后介绍一下yeild()

    yeild()就是简单让线程让出cpu资源,所以yeid()只是一种谦让的方法,因为是谦让,所以他可以刚谦让过,立马就又恢复运行,但是!!!yeild不会释放对象锁!!!!

    package page_7;
    
    public class ThreadYieldAndSleepTest implements Runnable {
        private int count = 0;// 系统访问次数
    
        @Override
        public synchronized void run() {// 通过synchronized实现同步
            count++;
            try {
                if (count == 1) {
                    /// <注>. sleep 和 yield 都不会释放 <锁资源>。
                    Thread.yield();
                }
            }  catch (Exception e) {
                // TODO: handle exception
            }
    
            System.out.println(Thread.currentThread().getName() + "线程: " + "第" + count + "位访客来啦!");
        }
    
        public static void main(String[] args) {
            ThreadYieldAndSleepTest rd = new ThreadYieldAndSleepTest();
            for (int i = 1; i <= 50; i++) {
                Thread thread = new Thread(rd, String.valueOf(i));
                thread.start();
            }
        }
    }

    运行结果为:

    1线程: 第1位访客来啦!
    50线程: 第2位访客来啦!
    49线程: 第3位访客来啦!
    48线程: 第4位访客来啦!
    47线程: 第5位访客来啦!
    ......

    没有被抢占,所以yeild()不会释放锁!

    最后介绍一下sleep

    sleep的介绍很多,sleep是不会释放锁的

    总结 

    sleep和yeild 一样不会释放锁

    join 会释放锁

    sleep和join如果不考虑对象锁的情况下,功能基本一致

  • 相关阅读:
    CSS使用
    html基础
    面对对象之@classmethod、@staticmethod用法
    验证金额价格的正则表达式
    webstorm 2017.2.2 license server
    Oracle 查询当前系统时间十分钟之前的记录,时间比较SQL
    AngularJS-自定义过滤器 ng-repeat 求和
    封装http请求键值对的js函数
    获取当前的日期时间的js函数,格式为“yyyy-MM-dd hh:mm:ss”
    将金额数字转换为大写汉字的js函数
  • 原文地址:https://www.cnblogs.com/samanian/p/12017572.html
Copyright © 2020-2023  润新知