好文章转载!
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方法有时候更加方便。
分享到:
相关推荐
本文将深入探讨Java中的四个关键方法:`sleep()`, `wait()`, `yield()`和`join()`,以及它们各自的特点和区别。 首先,我们来看`sleep()`和`wait()`的区别: 1. **来源不同**:`sleep()`是`Thread`类的方法,它...
本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、notifyAll()用法 wait()、notify()和notifyAll()是Object类...
- 定时等待(Timed Waiting):线程通过`sleep()`, `join(long timeout)`或`Object.wait(long timeout)`进入有限期等待状态。 - 终止(Terminated):线程执行完毕或被中断。 3. **线程同步** - **同步方法**:...
- `Thread.sleep(long millis)`:使当前线程暂停指定毫秒数,让其他线程有机会执行。 - `Thread.yield()`: 让当前线程暂停,让其他相同优先级的线程有机会执行。 此外,`java.util.concurrent`包提供了高级线程管理...
Java提供了丰富的线程控制方法,如`start()`启动线程,`sleep()`使线程暂停一段时间,`join()`让当前线程等待指定线程结束,`yield()`让当前线程让出CPU执行权,以及`interrupt()`中断线程等。 Java还提供了同步...
本资源主要讲解了Java中四个常用的线程控制方法:sleep()、yield()、join()和wait(),它们是Java多线程编程中的重要组成部分。下面是对每个方法的详细讲解: 1. sleep()方法: sleep()方法是Thread类...
Thread.Sleep(2000); Console.WriteLine($"'{Thread.CurrentThread.Name}' thread finished executing."); } } } ``` 这段代码首先创建了一个新的线程`newThread`,并指定了要执行的方法`WorkerMethod`。然后...
Thread.Sleep(1000); Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} is releasing the lock."); } } } ``` 在这个例子中,`DoWork`方法在一个受保护的代码块(由`lock`关键字创建)中...
25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................
Java Thread类是线程的核心,它提供了用于创建、控制和管理线程的方法。 1. **线程的创建方式** - 继承Thread类:创建一个新的类,该类继承自Thread类,并重写它的run()方法。然后创建该类的实例并调用start()方法...
25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................
在上述示例中,`TestIsAlive`展示了如何使用`isAlive()`方法检查线程是否运行,而`TestInterrupt`演示了`sleep()`和`interrupt()`的用法。当`Thread.sleep()`被`interrupt()`打断时,`InterruptedException`会被抛出...
`interrupt()`方法可以用来中断一个线程,通常与`Thread.sleep()`或`Object.wait()`方法结合使用。当线程被中断时,会抛出`InterruptedException`。例如: ```java public class StopThreadDemo extends JFrame ...
2. **解决方案:** 可以通过`Thread.join()`方法实现线程之间的顺序执行。`Thread.join()`使得当前线程等待调用该方法的线程执行完毕。 **示例代码:** ```java Thread t1 = new Thread(() -> { System.out....
如果那个线程在执行一个低级可中断阻塞方法,例如 Thread.sleep()、Thread.join() 或 Object.wait(),那么它将取消阻塞并抛出 InterruptedException。否则,interrupt() 只是设置线程的中断状态。 在被中断线程中...
Java还提供了其他线程控制的工具,比如`Thread.sleep()`用于让线程暂停指定时间,`Thread.yield()`让当前线程让步给其他线程,以及`Thread.join()`等待特定线程结束。另外,线程池(ThreadPool)和Executor框架是...
2. **所属对象**: `wait()`是`Object`类的方法,`sleep()`是`Thread`类的静态方法。 3. **用途**: `wait()`主要用于线程间的协作与同步,`sleep()`主要用于让线程暂停执行一段时间。 ```java // 使用wait() ...
本示例主要介绍了如何使用`System.Threading.Thread`类来创建和管理多线程,以进行并行计算。 首先,我们需要引入必要的命名空间: ```csharp using System; using System.Collections.Generic; using System.Linq;...
当你在代码中调用诸如`Thread.sleep()`, `Thread.join()`, 或 `Object.wait()`等阻塞方法时,如果线程被中断,这些方法会抛出`InterruptedException`。这个异常的出现并不是错误,而是线程系统向你发出的一个信号,...
3. **`Thread.sleep()`, `Object.wait()`, `Thread.join()`** 这些方法在遇到中断时会立即抛出`InterruptedException`,从而让线程退出阻塞状态。因此,在使用这些方法时,建议总是检查中断状态,这样可以优雅地...