美文网首页Java
【多线程】——6.线程常用方法

【多线程】——6.线程常用方法

作者: 衰煋 | 来源:发表于2020-03-30 23:10 被阅读0次

线程常用方法

sleep()

1.让当前线程暂停指定时间。

2.sleep()只是暂时让出CPU的执行权,并不释放锁。

public class SleepTest {

    /**

    * sleep()方法不会释放锁,因此线程是按照先后顺序执行的

    */

    public synchronized void sleepMethod(){

        System.out.println("Sleep start : "

                + Thread.currentThread().getName());

        try {

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println("Sleep end : "

                + Thread.currentThread().getName());

    }

    /**

    * wait()方法会释放锁,因此一旦调用wait()方法就会造成其他线程运行

    */

    public synchronized void waitMethod(){

        System.out.println("Wait start : "

                + Thread.currentThread().getName());

        synchronized (this){

            try {

                wait(1000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

        System.out.println("Wait end :"

                + Thread.currentThread().getName());

    }

    public static void main(String[] args) {

        final SleepTest test1 = new SleepTest();

        for(int i = 0; i < 5; i++){

            new Thread(() -> test1.sleepMethod()).start();

        }

        try {

            //暂停十秒,等上面程序执行完成

            Thread.sleep(10000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println("-----分割线-----");

        final SleepTest test2 = new SleepTest();

        for(int i = 0; i < 5; i++){

            new Thread(() -> test2.waitMethod()).start();

        }

    }

}

输出结果:

Sleep start : Thread-0

Sleep end : Thread-0

Sleep start : Thread-4

Sleep end : Thread-4

Sleep start : Thread-3

Sleep end : Thread-3

Sleep start : Thread-2

Sleep end : Thread-2

Sleep start : Thread-1

Sleep end : Thread-1

-----分割线-----

Wait start : Thread-5

Wait start : Thread-6

Wait start : Thread-7

Wait start : Thread-8

Wait start : Thread-9

Wait end :Thread-7

Wait end :Thread-8

Wait end :Thread-9

Wait end :Thread-5

Wait end :Thread-6

从代码中可以看出来两个方法都是同步方法,加了锁,但是sleep()方法是有顺序的,0线程先抢占到了执行权,执行后sleep()没有释放锁,其他线程不能进这个方法,等到释放后其他的才会继续抢占。而wait()方法会释放对象锁,一旦wait(),其他的线程就进来抢占

3.由于对象锁没有被释放,其他线程仍然无法访问这个对象。

4.sleep()方法不需要在同步的代码块中执行。

5.sleep()方法可以通过interrupt()方法打断线程的暂停状态。

6.sleep()只是线程的操作,用于短时间暂停线程,不涉及线程间通信。

7.sleep()是Thread类的方法。

wait()方法

1.wait()/notify()通常成对出现。

2.wait()/notify()方法需要获取对象锁方可调用。

3.wait()/notify()方法要写在同步代码块或者同步方法内。

4.一旦调用wait()方法,其他对象方可访问这个对象。

5.当一个线程执行到wait()方法时,他就进入到一个和该对象相关的等待池中,同时失去对象的机锁,可以允许其他线程执行一些同步操作。

6.wait()可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出中断异常。

7.重获对象锁

a)设置wait()方法的参数,如wait(1000)表明借出去1秒钟后自动收回锁

b)让借锁的线程通知(notify())当前线程,借锁线程用完了当前线程马上就收回来

8.wait()/notify()是Object类的方法

notify()/notifyAll()

1.notify()唤醒在对象监视器(对象锁)上等待的单个线程

2.当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。

3.该线程将等待从锁池中获得锁,然后回到wait()前的中断现场

4.notifyAll()唤醒在对象监视器(对象锁)上等待的所有线程

5.唤醒线程的顺序——LIFO

6.wait()/notify()/notifyAll()涉及线程间的通信

相关文章

  • 【多线程】——6.线程常用方法

    线程常用方法 sleep() 1.让当前线程暂停指定时间。 2.sleep()只是暂时让出CPU的执行权,并不释放...

  • 多线程学习笔记目录

    基础 如何开启多线程 多线程常用的方法 线程的状态 线程中断 synchronized关键字 wait和notif...

  • Java程序员福利——阿里架构师详解Java多线程常用方法的使用

    前言 Java多线程的常用方法基本分为:获取当前线程的操作,线程休眠sleep()方法,线程让步yield()方法...

  • 2019.03.21总结

    09:00~12:00上午课程,多线程 14:00-15:25 多线程 Thread类的常用方法 【重点】 ...

  • java线程&和各种奇奇怪怪的锁

    1、Java线程 一、Java多线程常用的两种实现方法 1、 继承Thread类 子类继承Thread类具备多线程...

  • Java并发之synchronized

    Java多线程同步关键词是常用的多线程同步手段。它可以修饰静态类方法,实例方法,或代码块。修饰static静态方法...

  • 线程 一

    目录 1.多线程 2.线程对比进程 3.线程间资源共享 4.守护线程 5.线程中常用属性 6.线程互斥锁 7.信号...

  • iOS 多线程简介

    一.本文介绍点 1.为什么要学习多线程2.什么是多线程3.多线程的原理4.多线程的优缺点5.多线程的应用6.多线程...

  • java多线程

    java多线程 线程类源码解读(2)-线程状态及常用方法 线程类源码解读(3)-线程中断 逐行分析AQS源码(1)...

  • iOS底层原理总结 -多线程详解

    目录:一. 多线程基础1.进程2.线程3.进程和线程的比较4.线程的串行5.多线程6.多线程原理7.多线程优缺点8...

网友评论

    本文标题:【多线程】——6.线程常用方法

    本文链接:https://www.haomeiwen.com/subject/oqxiuhtx.html