多线程中sleep() wait() yield() join(), interrupt(),stop(),suspend(),setPriority()用法与区别

版权声明:文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除或授权事宜,如果有误,请联系作者更改,谢谢,本人微信:void666666 https://blog.csdn.net/wt520it/article/details/83902550

网上却是有很多的关于这个的答案,但是都长得一样,为了写这篇博客,自己找了几个例子。
JoinThread:


package com.com.aaa.threadJoinDemo;

public class JoinThread extends Thread{

    public JoinThread(String name) {
            super(name);
    }

    @Override
    public void run() {
        for (int i=0;i<100;i++){
            System.out.println(this.getName()+"----i"+i);
        }
    }
}

主函数:


package com.com.aaa.threadJoinDemo;

public class MainJoinThread {

    public static void main(String[] args) throws InterruptedException {
        JoinThread j1=new JoinThread("小明");
        JoinThread j2=new JoinThread("小红");
        j1.start();
        j2.start();
    }
}

想必有经验的都知道,他们每次运行的结果都是不一样的?到底为什么呢?最主要的原因就是县城之间需要竞争CPU,然后调用run方法才能够执行。废话不必多说,进行下边的实验哈。

Thread 类的常用函数及功能:

1.sleep():

使当前的正在执行线程处于停滞状态,sleep()使线程进入堵塞状态,同时不会释放所资源,

sleep可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会

package com.com.aaa.threadJoinDemo;

public class MainJoinThread {

    public static void main(String[] args) throws InterruptedException {
        JoinThread j1=new JoinThread("小明");
        JoinThread j2=new JoinThread("小红");
        j1.start();
        Thread.sleep(500);
        j2.start();
    }
}

说明:当j1执行完毕之后,Thread.sleep(500)让线程处于睡眠状态,过了500l之后,线程继续运行

2.wait():

是当前线程处于等待状态,会释放当前的锁资源,使用wait()的时候要处理

直接看代码:
这个是调用wait()方法

package com.com.aaa.threadWaitDemo;

public class ThreadWaitOne extends Thread {
    private Object lock;

    public ThreadWaitOne(Object lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        try {
            synchronized (lock){
                System.out.println("开始执行哈"+System.currentTimeMillis());
                lock.wait();
                System.out.println("执行结束"+System.currentTimeMillis());
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

唤醒wait()

package com.com.aaa.threadWaitDemo;

public class ThreadWaitTwo extends Thread {

    private Object lock;


    public ThreadWaitTwo(Object lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        synchronized (lock){
            System.out.println("开始唤醒"+System.currentTimeMillis());
            lock.notify();
            System.out.println("开始结束"+System.currentTimeMillis());
        }
    }
}

主函数

package com.com.aaa.threadWaitDemo;

public class MainThreadWait {
    public static void main(String[] args) throws Exception{
        Object lock=new Object();
        ThreadWaitOne t1=new ThreadWaitOne(lock);
        t1.start();
        Thread.sleep(5000);


        ThreadWaitTwo t2=new ThreadWaitTwo(lock);
        t2.start();

    }
}

运行结果:
在这里插入图片描述

说明:如果t2线程没有将t1线程唤醒,t1会永远处于等待状态

注意:

  1. wait()、notify()、notifyAll()都必须在synchronized中执行,否则会抛出异常
  2. wait()、notify()、notifyAll()都是属于超类Object的方法
  3. 一个对象只有一个锁(对象锁和类锁还是有区别的)

wait()和sleep()区别:

a).wait()可以不指定时间,sleep()必须指定时间
b).wait()不会释放当前锁资源,sleep()能够释放锁资源
).wait()是来自Object类中,sleep()是来自Thread类

扫描二维码关注公众号,回复: 4621597 查看本文章

3.join():

join()就是让其他线程变为等待(结合例子:知道j1执行完后,才释放)
package com.com.aaa.threadJoinDemo;

public class MainJoinThread {

    public static void main(String[] args) throws InterruptedException {
        JoinThread j1=new JoinThread("小明");
        JoinThread j2=new JoinThread("小红");
        j1.start();
        j1.join();
        j2.start();
    }
}

说明:运行结果也不用说了,肯定是小明先执行完毕。

4.stop():

可以停止正在执行得线程,这样的方法不安全,不建议使用。他会解除线程获取的所有锁定,如果线程处于一种不连贯的状态,其他线程有可能在那种状态下检查和修改他们,很难找到问题的所在。

5.suspend():

容易发生死锁,调用suspend()的时候,目标线程会停止,但是却仍然有之前获取的锁定。此时,其他线程都不能有访问线程锁定的资源,除非被"挂起"的线程恢复运行。需要在Thread类中有一个标志

若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。

6.interrupt()

interrupt()不会中断一个正在运行的线程。这一方法实际上完成的是:在线程受到阻塞时抛出一个中断信号,线程就得以退出阻塞的状态。

如果线程被Object.wait,Thread.join,Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。
如果线程没有被阻塞,这时调用interrupt()将不起作用。

7.yield():

只是使当前线程重新回到可执行状态,所以执行yield()线程有可能在进入到可执行状态后马上又被执行.

只能使同优先级的线程有执行的机会。同样, yield()也不会释放锁资源.

8.setPriority():

线程分配时间片的多少就决定线程使用处理的多少,刚好对应线程优先级别这个概念。可以通过int priority(),里边可以填1-10,默认为5,10最高。
package com.com.aaa.threadJoinDemo;

public class MainJoinThread {

    public static void main(String[] args) throws InterruptedException {
        JoinThread j1=new JoinThread("小明");
        JoinThread j2=new JoinThread("小红");
        j2.setPriority(10);
        j1.start();

        j2.start();

    }
}

看下结果,只截图一部分
在这里插入图片描述
本来j1先运行的,结果j2运行完之后,j1才运行的,确实说明j2的优先级别要比j1的高

文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除或授权事宜
如果有误,请联系作者更改,谢谢,本人微信:void666666

猜你喜欢

转载自blog.csdn.net/wt520it/article/details/83902550