Thread相关方法介绍

本文详细介绍了Java中用于线程控制的几种方法,包括Object.wait()和Object.notify()的作用及使用注意事项,对比了Thread.sleep()的区别,并通过实例演示了Thread.join()的使用方式。

1、Object.wait(),Object.notify()
作用:当在一个线程内调用object.wait方法后,这个线程会释放掉当前持有的对象锁,直到调用object.notify方法唤醒。
注意事项:需要在synchronized同步块中执行。
例子:

final Object o = new Object();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized(o) {
                    Log.d(TAG,"T1获取synObj的对象监视器,开始执行同步块");
                    try {
                        TimeUnit.SECONDS.sleep(1);
                        Log.d(TAG,"T1在 wait()时挂起了");
                        o.wait();
                        Log.d(TAG,"T1被T2唤醒后并重新获得synObj的对象监视器,继续执行");
                    }catch(InterruptedException e) {
                        e.printStackTrace();
                    }
                    Log.d(TAG,"T1获取synObj的对象监视器,结束同步块");
                }
            };
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG,"T2启动,但是因为T1占用了synObj的对象监视器,则等待T1执行synObj.wait来释放它");
                synchronized(o) {
                    try {
                        Log.d(TAG,"在T1执行synObj.wait后,T2获取synObj的对象监视器,进入同步块");
                        o.notify();
                        Log.d(TAG,"T2执行synObj.notify(),T1被唤醒,但T2还在同步块中,没有释放synObj的对象监视器,T1等待synObj的对象监视器");
                        TimeUnit.SECONDS.sleep(1);
                        Log.d(TAG,"T2结束同步块,释放synObj的对象监视器,T1获取到synObj的对象监视器,并执行wait后面的操作");
                    }catch(InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
        });

        t1.start();
        t2.start();

结果:
T1获取synObj的对象监视器,开始执行同步块
T2启动,但是因为T1占用了synObj的对象监视器,则等待T1执行synObj.wait来释放它
T1在 wait()时挂起了
在T1执行synObj.wait后,T2获取synObj的对象监视器,进入同步块
T2执行synObj.notify(),T1被唤醒,但T2还在同步块中,没有释放synObj的对象监视器,T1等待synObj的对象监视器
T2结束同步块,释放synObj的对象监视器,T1获取到synObj的对象监视器,并执行wait后面的操作
T1被T2唤醒后并重新获得synObj的对象监视器,继续执行
T1获取synObj的对象监视器,结束同步块

与Thread.sleep的区别:
1、Thread.sleep无需再同步语句中执行
2、Thread.sleep不会释放锁

2、Thread.yield()
作用:当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程。调用yield的时候锁并没有被释放。

3、Thread.join()
作用:此方法不是静态方法。当某个线程调用此方法后,其他线程要等到这个线程执行完后才能继续执行。
Thread.join(long millis),等待millis 毫秒终止线程,假如这段时间内该线程还没执行完,那么结束等待,2个线程并发执行
例子:

JoinThread joinThread = new JoinThread();
        joinThread.start();
        try {
            joinThread.join(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i=0;i<10;i++){
            try {
                Thread.sleep(1000);
                Log.d(TAG,"main"+i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
class JoinThread extends Thread{
        @Override
        public void run() {
            for (int i=0;i<10;i++){
                Log.d(TAG,"JoinThread"+i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

结果:
JoinThread0
JoinThread1
JoinThread2
main0
JoinThread3
main1
JoinThread4
main2
JoinThread5
main3
JoinThread6
main4
JoinThread7
main5
JoinThread8
main6
JoinThread9
main7
main8
main9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值