重学JAVA基础(七):线程的wait、notify、notifyAll、sleep

/**
 * 测试thread的wait  notify  notifyAll  sleep  Interrupted
 * @author tomsnail
 * @date 2015年4月20日 下午3:20:44
 */
public class Test1 {

    /**
     * 对象锁
     * @author tomsnail
     * @date 2015年4月20日 下午3:14:13
     */
    private static final Object lockObject = new Object();

    /**
     * 等待线程
     * @author tomsnail
     * @date 2015年4月20日 下午3:14:22
     */
    static class Thread1 implements Runnable{

        @Override
        public void run() {
            synchronized (lockObject) {
                try {
                    System.out.println(Thread.currentThread().getName()+"wait start");
                    lockObject.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"wait end");
            }
        }

    }

    /**
     * 唤醒线程
     * @author tomsnail
     * @date 2015年4月20日 下午3:14:36
     */
    static class Thread2 implements Runnable{

        @Override
        public void run() {
            synchronized (lockObject) {
                lockObject.notify();
                System.out.println(Thread.currentThread().getName()+"notify");
            }
        }
    }

    /**
     * 唤醒所有线程
     * @author tomsnail
     * @date 2015年4月20日 下午3:14:51
     */
    static class Thread3 implements Runnable{

        @Override
        public void run() {
            synchronized (lockObject) {
                lockObject.notifyAll();
                System.out.println(Thread.currentThread().getName()+"notifyAll");
            }
        }
    }

    /**
     * 睡眠线程
     * @author tomsnail
     * @date 2015年4月20日 下午3:20:30
     */
    static class Thread4 implements Runnable{

        @Override
        public void run() {
            try {
                System.out.println(Thread.currentThread().getName()+"sleep");
                Thread.currentThread().sleep(20000);
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getName()+"Interrupted");
            }

        }

    }

    public static void main(String[] args) {
        Thread t1 = new Thread(new Thread1());
        Thread t3 = new Thread(new Thread1());
        Thread t4 = new Thread(new Thread1());
        Thread t2 = new Thread(new Thread2());
        Thread t5 = new Thread(new Thread3());
        //3个等待线程运行
        t1.start();
        t3.start();
        t4.start();
        try {
            Thread.currentThread().sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //唤醒线程运行
        t2.start();
        try {
            Thread.currentThread().sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //唤醒所有线程运行
        t5.start();
        //睡眠线程
        Thread t6 = new Thread(new Thread4());
        t6.start();
        try {
            Thread.currentThread().sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //睡眠线程中断
        t6.interrupt();
    }

}

结果

Thread-0wait start
Thread-2wait start
Thread-1wait start
Thread-3notify
Thread-0wait end
Thread-4notifyAll
Thread-1wait end
Thread-2wait end
Thread-5sleep
Thread-5Interrupted
时间: 2024-08-29 21:06:33

重学JAVA基础(七):线程的wait、notify、notifyAll、sleep的相关文章

重学JAVA基础(四):线程的创建与执行

1.继承Thread public class TestThread extends Thread{ public void run(){ System.out.println(Thread.currentThread().getName()); } public static void main(String[] args) { Thread t = new TestThread(); t.start(); } } 2.实现Runnable public class TestRunnable

重学JAVA基础(八):锁的基本知识

1.线程状态 如上图,当我们新建一个线程,并start后,其实不一定会马上执行,因为只有操作系统调度了我们的线程,才能真正进行执行,而操作系统也随时可以运行其他线程,这时线程又回到可运行状态.这个过程是操作系统控制的,不是我们能控制的.我们能控制的是将线程变为blocked,并从blocked变为runable状态. 在以前实验的wait和notify中,我当时并没有注意到notify后会进行锁阶段,以为notify后直接进入runable状态,等待操作系统调度.  从上面的图中可以看到,我们n

重学JAVA基础(一):PATH和CLASSPATH

我想大多数Java初学者都会遇到的问题,那就是怎么配置环境,执行java -jar xxx.jar  都会报NoClassDefFindError,我在最开始学习的时候,也遇到了这些问题. 1.PATH path是路径的意思,我们直接在控制台运行一个程序时候,系统都会在指定的path下去找有没有这个程序,如果有就执行,没有就报错或者提示. 在windows系统中,使用echo %PATH%来查看PATH下的路径 在linux系统中,使用 echo $PATH 我们将java的bin目录加入pat

重学JAVA基础(五):面向对象

1.封装 import java.util.Date; public class Human { protected String name; protected BirthDay birthDay; protected String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return

重学JAVA基础(二):Java反射

看一下百度的解释: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息    以及动态调用对象的方法的功能称为java语言的反射机制. 先看一下一个例子: 这是最简单的反射使用方法,通过反射来调用类的方法. 下面通过一个需求来做反射实验:有3种人类(黄,白,黑),分别继承于Human类,都有人类的共同操作Behaviour /** * 行为,区别于动物 * @author tomsnail *

重学JAVA基础(六):多线程的同步

1.synchronized关键字 /** * 同步关键字 * @author tomsnail * @date 2015年4月18日 下午12:12:39 */ public class SyncThreadTest { private static final byte[] lock = new byte[1]; /** * 同步方法 * @author tomsnail * @date 2015年4月18日 下午12:15:30 */ public synchronized void te

重学JAVA基础(三):动态代理

1.接口 public interface Hello { public void sayHello(); } 2.实例类 public class Hello2 { public void sayHello() { System.out.println("hello world2!"); } } public class Hello3 extends Hello2{ } public class HelloImpl implements Hello{ @Override public

重学Java(一):与《Java编程思想》的不解之缘

说起来非常惭愧,我在 2008 年的时候就接触了 Java,但一直到现在(2018 年 10 月 10 日),基础知识依然非常薄弱.用一句话自嘲就是:十年 IT 老兵,Java 菜鸡一枚. 于是,我想,不如静下心来,重新读一遍那些经典的 Java 技术书,并且没读完一章就输出一篇原创技术文章.从哪一本开始呢?想了一想,还是从<Java 编程思想>开始吧!毕竟这本书赢得了全球程序员的广泛赞誉,从 Java 的基础语法到最高级特性,都能指导我们 Java 程序员轻松掌握. 记得刚上大学那会,就买了

(CZ深入浅出Java基础)线程笔记

一.线程的引入 1.多线程概述 1.1.进程 a.正在运行的程序,是系统进行资源分类和调用的独立单位. b.每个进程都有它自己的内存空间和系统资源. 1.2.线程 a.是进程中的单个顺序控制流,是一条执行路径. b.一个进程如果只有一条路径,则称为单线程程序. c.一个进程如果有多条执行路径,则称为多线程程序. 1.3.小结 线程多的进程抢到CPU执行权的概率大,但是仍具有随机性. 2.Java程序运行原理 2.1.Java运行 Java命令会启动Java虚拟机,启动JVM,等于启动了一个应用程