`
wujianjun
  • 浏览: 144069 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Thread.sleep 和Object.join的使用

阅读更多

好文章转载!

 

sleep:Thread的静态方法,当前线程休眠一段时间,时间到了再恢复可运行状态,时间到了不一定就执行吧,还得竞争CPU呢.

join:这个方法其实就是特殊的wait,wait方法一般都需要别人notify(当然也可以设置超时),但是join方法就不需要别人notify了,一直等到这个线程死亡(就相当于这个线程临时前告诉那些在等它的人:你们进来吧!)

本人不是很会举例子,还是两个人公用一个卫生间吧,这回不刷牙了,改洗澡吧,总不能两个人同时洗澡吧!就算可以,这里假设不可以吧.情况时这样的:A在洗澡,B要等。

第一种情况:
B很聪明的,A洗澡可能要20分钟到1小时,我就先睡10分钟看看好了没有,没有好就再睡10分钟,最多多等10分钟而已吧.

class Syn
{
        public static void main(String[] args) throws Exception
       {
               Thread a=new Bathing();
                a.start();
                //B
                int time=0;
                while(a.isAlive()){
                        Thread.sleep(10000);
                        time+=10;
                        System.out.println("B has waited "+time+" minutes");
                }
                System.out.println("B can bath now!");
        }
}

class Bathing extends Thread
{
        public void run(){
                bathing();
        }
        private void bathing() {
                System.out.println("A is bathing !");
                try{Thread.sleep(20000);}catch(InterruptedException e){e.printStackTrace();}
                //延迟20秒看效果
                System.out.println("A has bathed !");
        }
};

这里连同步都不需要,不过B可能需要多等一段时间,因为它可能刚好去敲门A还没有洗完,于是他又去睡,结果刚睡下A就洗完了.
第二种情况:
B变得更加聪明了,这样等我不是亏了,如果我10分钟敲一次门,我可能要多等10分钟,但是如果我每秒敲一次我也没法睡呀,于是想了一个高招,装了一个机关,当A出来的时候机关就会按响门铃,这样B就可以高枕无忧了。

class Syn
{
        public static void main(String[] args) throws Exception
        {
                Thread a=new Bathing();
                a.start();
                //B
                int time=0;
                a.join();
                System.out.println("B can bath now!");
          }
}

class Bathing extends Thread
{
        public void run(){
                bathing();
        }
        private void bathing() {
                System.out.println("A is bathing !");
                try{Thread.sleep(20000);}catch(InterruptedException e){e.printStackTrace();}
                //延迟20秒看效果
                System.out.println("A has bathed !");
        }
};

这样只要A一洗完,B就会被唤醒,这里A并没有去notify他,但是还是间接的通知了B,当然这里也可以用wati和notify实现,不过就显得不好了。

class Syn
{
        public static void main(String[] args) throws Exception
        {
                Thread a=new Bathing();
                a.start();
                //B
                int time=0;
                synchronized(a){a.wait();}
                System.out.println("B can bath now!");
        }
}

class Bathing extends Thread
{
        public void run(){
                synchronized(this){
                    bathing();
                    notify();
                }
        }
        private void bathing() {
                System.out.println("A is bathing !");
                try{Thread.sleep(20000);}catch(InterruptedException e){e.printStackTrace();}
                //延迟20秒看效果
                System.out.println("A has bathed !");
        }
};

对于一般的对象就要用wait和notify了,但是对于一个线程来说,join方法有时候更加方便。

分享到:
评论

相关推荐

    sleep()、wait()、yield()和join()方法特点及区别.docx

    本文将深入探讨Java中的四个关键方法:`sleep()`, `wait()`, `yield()`和`join()`,以及它们各自的特点和区别。 首先,我们来看`sleep()`和`wait()`的区别: 1. **来源不同**:`sleep()`是`Thread`类的方法,它...

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、notifyAll()用法 wait()、notify()和notifyAll()是Object类...

    Java课件\thread.rar

    - 定时等待(Timed Waiting):线程通过`sleep()`, `join(long timeout)`或`Object.wait(long timeout)`进入有限期等待状态。 - 终止(Terminated):线程执行完毕或被中断。 3. **线程同步** - **同步方法**:...

    java_Thread.rar_java thread runable_thread runable

    - `Thread.sleep(long millis)`:使当前线程暂停指定毫秒数,让其他线程有机会执行。 - `Thread.yield()`: 让当前线程暂停,让其他相同优先级的线程有机会执行。 此外,`java.util.concurrent`包提供了高级线程管理...

    javathread.part05.rar

    Java提供了丰富的线程控制方法,如`start()`启动线程,`sleep()`使线程暂停一段时间,`join()`让当前线程等待指定线程结束,`yield()`让当前线程让出CPU执行权,以及`interrupt()`中断线程等。 Java还提供了同步...

    高薪程序员面试题精讲系列63之说说sleep()、yield()、join()、wait()的区别.pdf,这是一份不错的文件

    本资源主要讲解了Java中四个常用的线程控制方法:sleep()、yield()、join()和wait(),它们是Java多线程编程中的重要组成部分。下面是对每个方法的详细讲解: 1. sleep()方法: sleep()方法是Thread类...

    C#多线程.doc

    Thread.Sleep(2000); Console.WriteLine($"'{Thread.CurrentThread.Name}' thread finished executing."); } } } ``` 这段代码首先创建了一个新的线程`newThread`,并指定了要执行的方法`WorkerMethod`。然后...

    C# 2005 线程示例

    Thread.Sleep(1000); Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} is releasing the lock."); } } } ``` 在这个例子中,`DoWork`方法在一个受保护的代码块(由`lock`关键字创建)中...

    java核心知识点整理.pdf

    25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................

    javathread.part01.rar

    Java Thread类是线程的核心,它提供了用于创建、控制和管理线程的方法。 1. **线程的创建方式** - 继承Thread类:创建一个新的类,该类继承自Thread类,并重写它的run()方法。然后创建该类的实例并调用start()方法...

    JAVA核心知识点整理(有效)

    25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................

    JAVA多线程操作方法实用大全

    在上述示例中,`TestIsAlive`展示了如何使用`isAlive()`方法检查线程是否运行,而`TestInterrupt`演示了`sleep()`和`interrupt()`的用法。当`Thread.sleep()`被`interrupt()`打断时,`InterruptedException`会被抛出...

    java线程编程从入门到精通(五).docx

    `interrupt()`方法可以用来中断一个线程,通常与`Thread.sleep()`或`Object.wait()`方法结合使用。当线程被中断时,会抛出`InterruptedException`。例如: ```java public class StopThreadDemo extends JFrame ...

    并发编程面试专题.pdf

    2. **解决方案:** 可以通过`Thread.join()`方法实现线程之间的顺序执行。`Thread.join()`使得当前线程等待调用该方法的线程执行完毕。 **示例代码:** ```java Thread t1 = new Thread(() -> { System.out....

    处理 InterruptedException1

    如果那个线程在执行一个低级可中断阻塞方法,例如 Thread.sleep()、Thread.join() 或 Object.wait(),那么它将取消阻塞并抛出 InterruptedException。否则,interrupt() 只是设置线程的中断状态。 在被中断线程中...

    JavaThread编程基础.pdf

    Java还提供了其他线程控制的工具,比如`Thread.sleep()`用于让线程暂停指定时间,`Thread.yield()`让当前线程让步给其他线程,以及`Thread.join()`等待特定线程结束。另外,线程池(ThreadPool)和Executor框架是...

    15个顶级Java多线程面试题及回答.docx

    2. **所属对象**: `wait()`是`Object`类的方法,`sleep()`是`Thread`类的静态方法。 3. **用途**: `wait()`主要用于线程间的协作与同步,`sleep()`主要用于让线程暂停执行一段时间。 ```java // 使用wait() ...

    C#(asp.net)多线程用法示例(可用于同时处理多个任务)

    本示例主要介绍了如何使用`System.Threading.Thread`类来创建和管理多线程,以进行并行计算。 首先,我们需要引入必要的命名空间: ```csharp using System; using System.Collections.Generic; using System.Linq;...

    Java处理InterruptedException异常的理论与实践

    当你在代码中调用诸如`Thread.sleep()`, `Thread.join()`, 或 `Object.wait()`等阻塞方法时,如果线程被中断,这些方法会抛出`InterruptedException`。这个异常的出现并不是错误,而是线程系统向你发出的一个信号,...

    JavaThread中断机制共11页.pdf.zip

    3. **`Thread.sleep()`, `Object.wait()`, `Thread.join()`** 这些方法在遇到中断时会立即抛出`InterruptedException`,从而让线程退出阻塞状态。因此,在使用这些方法时,建议总是检查中断状态,这样可以优雅地...

Global site tag (gtag.js) - Google Analytics