前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >线程常用方法辨析(2)

线程常用方法辨析(2)

作者头像
黑洞代码
发布2021-01-14 15:45:18
2460
发布2021-01-14 15:45:18
举报

线程常用方法辨析(2)

概述


1.yield()

2.join()

3.总结

第1节 yield()方法


1. yield字面意思:放手,放弃,投降

2. yield()方法的意思是告诉CPU执行其他的线程,当前线程让出CPU的执 行权利

3. yield()方法不能保证使得当前正在运行的线程迅速转换到可运行的状态

4. yield()方法的作用就是将当前线程从执行中的状态转变到可执行状态

5. yield()方法不能保证其他线程一定能够执行,因为执行过yield()方法的线程当前依然是可执行的状态,有可能被cpu再次执行

6. 执行yield()方法的线程不会释放锁

代码语言:javascript
复制
public class Consumer extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("I am Consumer : Consumed Item " + i);
            Thread.yield();
        }
    }
}
代码语言:javascript
复制
public class Producer extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("I am Producer : Produced Item " + i);
//            Thread.yield();
        }
    }
}
代码语言:javascript
复制
public class YieldDemo {
    public static void main(String[] args) {
        Thread producer = new Producer();
        Thread consumer = new Consumer();
        // 最低优先级
        producer.setPriority(Thread.MIN_PRIORITY);
        // 最高优先级
        consumer.setPriority(Thread.MAX_PRIORITY);
        consumer.start();
        producer.start();
    }
}
代码语言:javascript
复制
I am Consumer : Consumed Item 0
I am Producer : Produced Item 0
I am Producer : Produced Item 1
I am Producer : Produced Item 2
I am Producer : Produced Item 3
I am Producer : Produced Item 4
I am Producer : Produced Item 5
I am Producer : Produced Item 6
I am Producer : Produced Item 7
I am Producer : Produced Item 8
I am Producer : Produced Item 9
I am Producer : Produced Item 10
I am Producer : Produced Item 11
I am Producer : Produced Item 12
I am Producer : Produced Item 13
I am Producer : Produced Item 14
I am Producer : Produced Item 15
I am Producer : Produced Item 16
I am Producer : Produced Item 17
I am Producer : Produced Item 18
I am Producer : Produced Item 19
I am Consumer : Consumed Item 1
I am Consumer : Consumed Item 2
I am Consumer : Consumed Item 3
I am Consumer : Consumed Item 4
I am Consumer : Consumed Item 5
I am Consumer : Consumed Item 6
I am Consumer : Consumed Item 7
I am Consumer : Consumed Item 8
I am Consumer : Consumed Item 9
I am Consumer : Consumed Item 10
I am Consumer : Consumed Item 11
I am Consumer : Consumed Item 12
I am Consumer : Consumed Item 13
I am Consumer : Consumed Item 14
I am Consumer : Consumed Item 15
I am Consumer : Consumed Item 16
I am Consumer : Consumed Item 17
I am Consumer : Consumed Item 18
I am Consumer : Consumed Item 19

第2节 join()


1. join()方法可以使得一个线程在另一个线程结束后再执行

2. 如果join()方法在一个线程实例上调用,

当前运行着的线程将阻塞直到这个线程执行完成了

3. join()方法可以设定超时时间,使得join()方法的影响在超时后无效

4. join()重载方法有:join(long millis),join(long millis, int nanos)

5. 当join()超时后,主方法和任务线程申请运行的时候是平等的

6. join()可以抛出InterruptedException对中断做出回应

代码语言:javascript
复制
public class JoinDemo {
    public static void main(String[] args) throws InterruptedException
    {
        Thread thread2
                = new Thread(() -> {
            System.out.println("thread2 started");
            System.out.println("thread2 sleeping for 2 seconds");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("thread2 completed");
        });

        Thread thread1 = new Thread(() -> {
            try {
                thread2.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("thread1 started");
            System.out.println("thread1 sleeping for 2 seconds");
            try
            {
                Thread.sleep(2000);
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            System.out.println("thread1 completed");
        });


        // 线程1启动
        thread1.start();
        // 线程1调用join()
        // 问题:线程1和线程2的运行先后
//        thread1.join();
        thread2.start();
    }
}
代码语言:javascript
复制
thread2 started
thread2 sleeping for 2 seconds
thread2 completed
thread1 started
thread1 sleeping for 2 seconds
thread1 completed

第3节 总结


1. Thread.sleep(long) 和Thread.yield()都是Thread类的静态方法,join()是由线程对象来调用

2. sleep()使线程从运行状态进入阻塞状态,超时后进入就绪态,

是否进入运行态就要看操作系统的内部调用机制

3. 如果Thread.sleep()/Thread.yield()使用在由synchronized锁定的代码块中,

那么在调用他们的过程当中,并不会释放锁。wait()方法会释放锁。

4. join()方法可以使得一个线程在另一个线程结束后再执行

5. yield()方法是让当前线程由运行状态进入就绪状态,然后让操作系统重新调度一次,

这次调度只会让处于就绪队列中比当前线程优先级高或者相等的线程运行,

很可能某个线程在调用了yield方法后,又被操作系统调度进来运行

6. wait()和notify()、notifyAll() 这三个方法用于协调多个线程对共享数据的存取,

必须在synchronized语句块内使用这三个方法,否则可能会抛出

(MonitorStateIlegalException,锁状态异常)

本文参与?腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-20,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 落叶飞翔的蜗牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com