`
xuedong
  • 浏览: 299096 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java的Thread测试[包括sleep,wait的使用比较]

    博客分类:
  • java
阅读更多

package javaBese;

public class ThreadTest {

/*
* 共同点: 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。

   不同点: Thread.sleep(long)可以不在synchronized的块下调用,而且使用Thread.sleep()不会丢失当前线程对任何对象的同步锁(monitor);
                object.wait(long)必须在synchronized的块下来使用,调用了之后失去对object的monitor, 这样做的好处是它不影响其它的线程对object进行操作。
   */

public void thread()
{
   System.out.println("I am here!");
  
   Thread thread = new Thread();
   Thread thread2 = new Thread();
   try {
   
    thread2.sleep(1000);
    System.out.println("sleep 1秒后,I am come back!");
   
    thread2.start();
    System.out.println("thread is start");
   
    thread2.stop();
    System.out.println("thread is stop");
   
    synchronized (thread)//如果使用wait,就必须synchronized来同步对象
    {
     System.out.println("");
     for (int i = 0; i < 5; i++) {
      thread.notify();//必须要放在synchronized方法的里面
      System.out.println("First,notify thread");
      thread.wait(1000);
      System.out.println("wait 1秒后,I am come back!");
     }
    }
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
}

public static void main(String[] args) {
   ThreadTest threadTest = new ThreadTest();
   threadTest.thread();
}

}

/*
* 复杂应用
程序会启动20个线程,20个线程都使用同一个sync的object(名字为SYNC)。 线程启动代码如下:

Java代码
final TC[] ts = new TC[20];  
        for (int i = 0; i < ts.length; i++) {  
            TC target = new TC("TC " + i, SYNC1);  
            Thread thread = new Thread(target);  
            ts[i] = target;  
            thread.start();  
}

final TC[] ts = new TC[20];
        for (int i = 0; i < ts.length; i++) {
            TC target = new TC("TC " + i, SYNC1);
            Thread thread = new Thread(target);
            ts[i] = target;
            thread.start();
}
------------------------------------------------------------
接下来马上启动另外一个线程用于做notify操作。

Java代码
// 一个用于停止的Thread  
        new Thread(new Runnable() {  
            public void run() {  
                synchronized (SYNC1) {  
                    int i = 10;  
                    while (i > 0) {  
                        System.out.println("Now will notify the thread " + i);  
                        ts[i].notifySelf();  
                        try {  
                            SYNC1.wait(10000);  
                        } catch (InterruptedException e) {  
                            e.printStackTrace();  
                        }  
                        i--;  
                    }  
                }  
            }  
}).start();

// 一个用于停止的Thread
        new Thread(new Runnable() {
            public void run() {
                synchronized (SYNC1) {
                    int i = 10;
                    while (i > 0) {
                        System.out.println("Now will notify the thread " + i);
                        ts[i].notifySelf();
                        try {
                            SYNC1.wait(10000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        i--;
                    }
                }
            }
}).start();

------------------------------------------------------------

Java代码
启动的TC线程代码如下:  

class TC implements Runnable {  

    private final String name;  

    private final Object sync;  

    private boolean isRunning = false;  

    public TC(String name, Object sync) {  
        this.name = name;  
        this.sync = sync;  
    }  

    public void run() {  
        synchronized (sync) {  
            while (true) {  
                // 每个线程默认都加入线程池排队。这样有助于打乱线程在主线程中启动的顺序,方便后面的观测。  
                if (!isRunning) {  
                    try {  
                        sync.wait(1000);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                    isRunning = true;  
                }  
                System.out.println(name + " Running .......");  
                try {  
                    sync.wait();  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }// Wait 1 second  
            }  
        }  
    }  

    public void notifySelf() {  
        synchronized (sync) {  
            System.out.println("Coming to notify the thread " + name);  
            sync.notify();  
        }  

    }  

}

启动的TC线程代码如下:

class TC implements Runnable {

    private final String name;

    private final Object sync;

    private boolean isRunning = false;

    public TC(String name, Object sync) {
        this.name = name;
        this.sync = sync;
    }

    public void run() {
        synchronized (sync) {
            while (true) {
                // 每个线程默认都加入线程池排队。这样有助于打乱线程在主线程中启动的顺序,方便后面的观测。
                if (!isRunning) {
                    try {
                        sync.wait(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    isRunning = true;
                }
                System.out.println(name + " Running .......");
                try {
                    sync.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }// Wait 1 second
            }
        }
    }

    public void notifySelf() {
        synchronized (sync) {
            System.out.println("Coming to notify the thread " + name);
            sync.notify();
        }

    }

}


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

输出日志如下(//部分是我加的注释,不是实际输出):

Now will notify the thread 10 //首先试着notify第10个TC
Coming to notify the thread TC 10 // 也确实调用了SYNC的notify操作,但是因为当前还没有任何线程在wait,所以这个notify信号就被丢弃掉了。这个notify过去就过去了。不会影响后面的任何操作了。
TC 1 Running .......
TC 5 Running .......
TC 0 Running .......
TC 2 Running .......
TC 4 Running .......
TC 6 Running .......
TC 8 Running .......
TC 10 Running .......
TC 12 Running .......
TC 14 Running .......
TC 7 Running .......
TC 9 Running .......
TC 11 Running .......
TC 13 Running .......
TC 15 Running .......
TC 17 Running .......
TC 3 Running .......
TC 18 Running .......
TC 16 Running .......
TC 19 Running ....... //启动20线程,这20个线程启动的顺序已经被打乱了。不会从头到尾1-20的启动,而是如log显示1,5,0,2,4,6,8,10,12,14.........
//每个线程启动后会被wait(). wait的顺序是1,5,0,2,4,6,8,10,12,14.........
Now will notify the thread 9
Coming to notify the thread TC 9
TC 1 Running .......
Now will notify the thread 8
Coming to notify the thread TC 8
TC 5 Running .......
Now will notify the thread 7
Coming to notify the thread TC 7
TC 0 Running .......
Now will notify the thread 6
Coming to notify the thread TC 6
TC 2 Running .......
Now will notify the thread 5
Coming to notify the thread TC 5
TC 4 Running .......
Now will notify the thread 4
Coming to notify the thread TC 4
TC 6 Running .......
Now will notify the thread 3
Coming to notify the thread TC 3
TC 8 Running .......
Now will notify the thread 2
Coming to notify the thread TC 2
TC 10 Running .......
Now will notify the thread 1
Coming to notify the thread TC 1
TC 12 Running .......
//总共10个notify操作,但是因为启动的时候一个notify因为没有任何wait的线程给丢弃了,所以,这里只有9个notify起到了作用。他们是按照进入pool的顺序排队给notify。
//一个notify操作仅仅激活一个wait队列中的第一个线程。一对一操作。

-------------------------------分割线------------------------------
使用notifyAll代替notify。

日志输出:

Now will notify the thread 10
Coming to notify the thread TC 10 //第一个notifyAll的操作还是被丢弃了
TC 0 Running .......
TC 1 Running .......
TC 3 Running .......
TC 5 Running .......
TC 7 Running .......
TC 9 Running .......
TC 11 Running .......
TC 13 Running .......
TC 15 Running .......
TC 17 Running .......
TC 19 Running .......
TC 2 Running .......
TC 4 Running .......
TC 6 Running .......
TC 8 Running .......
TC 10 Running .......
TC 12 Running .......
TC 14 Running .......
TC 16 Running .......
TC 18 Running .......
Now will notify the thread 9
Coming to notify the thread TC 9 //一个notifyAll的操作notify所以正在wait的线程。
TC 0 Running .......
TC 1 Running .......
TC 3 Running .......
TC 5 Running .......
TC 7 Running .......
TC 9 Running .......
TC 11 Running .......
TC 2 Running .......
TC 13 Running .......
TC 15 Running .......
TC 4 Running .......
TC 17 Running .......
TC 19 Running .......
TC 6 Running .......
TC 8 Running .......
TC 10 Running .......
TC 12 Running .......
TC 14 Running .......
TC 16 Running .......
TC 18 Running .......

* */

 

 

 

转自:http://hi.baidu.com/billgon/blog/item/503fb458997888cc9c820490.html

分享到:
评论

相关推荐

    java sleep()和wait()

    ### Java中的sleep()与wait()方法详解 #### 一、Java sleep()方法解析 ##### 1.1 方法定义与用途 `sleep()`方法是Thread类中的一个静态方法,用于让当前正在执行的线程暂停执行指定的时间(毫秒),之后线程将重新...

    java sleep和wait的解惑.docx

    在Java多线程编程中,`Thread.sleep()` 和 `Object.wait()` 是两个非常重要的方法,它们分别位于 `Thread` 类和 `Object` 类中,用于控制线程的行为。本文将深入探讨这两个方法的区别以及它们在实际开发中的应用场景...

    java中yieldsleep以及wait的区别.pdf

    Java中的多线程编程涉及到许多关键概念,包括`yield()`, `sleep()`, 和 `wait()`,这些都是控制线程执行的重要方法。理解它们的区别对于编写高效并发程序至关重要。 首先,`yield()`方法的作用是让当前正在执行的...

    详解Java中的sleep()和wait()的区别

    在Java编程语言中,`sleep()` 和 `wait()` 都是用来控制线程执行的重要方法,但它们的作用和使用场景有着显著的区别。以下是这两个方法的详细解释: 1. **`Thread.sleep(long milliseconds)`** - `sleep()` 方法是...

    Java Thread用法 经典

    ### Java Thread用法详解 #### 一、Java线程基础概念与重要性 在Java编程语言中,线程是程序执行的基本单位之一,它能够帮助我们实现多任务处理,提高程序运行效率。Java中的线程主要通过`java.lang.Thread`类来...

    sleep() 方法和wait()方法的区别.docx

    sleep() 方法是 Thread 类的静态方法,它的主要作用是使当前线程进入停滞状态(阻塞当前线程),让出 CPU 的使用,目的是不让当前线程独自霸占该进程所获的 CPU 资源,以留一定时间给其他线程执行的机会。...

    详解Java中wait和sleep的区别

    "详解Java中wait和sleep的区别" Java中wait和sleep的区别是Java多线程编程中一个重要的概念。这两个方法都可以用来暂停当前线程的执行,但是它们之间有着根本的区别。 首先,wait()是一个用于线程同步的实例方法...

    Java线程中sleep和wait的区别详细介绍

    Java线程中的`sleep()`和`wait()`方法都是在多线程环境中用于控制线程执行的重要工具,但它们之间存在着显著的区别。理解这些差异对于编写高效、正确的并发代码至关重要。 首先,Java的多线程机制基于抢占式模型,...

    多线程sleep,yield,wait区别

    `sleep`, `yield`, 和 `wait` 是 Java 中用于线程管理的三个重要方法,它们各自有着不同的功能和用途。理解它们的区别有助于编写出更加高效和可控的多线程程序。 1. **sleep() 方法** - `Thread.sleep(millisecond...

    Java Thread Programming

    本资料“Java Thread Programming”由Paul Hyde提供,包含了关于Java线程编程的理论知识和实践代码,旨在帮助开发者深入理解和熟练掌握Java线程。 首先,我们来了解一下Java中线程的基本概念。在Java中,可以通过两...

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

    以上就是对Java线程中wait、await、sleep、yield、join用法的总结。这些方法在实际开发中,对于控制多线程运行的时序和协调非常关键。理解这些方法的正确使用方式是掌握Java并发编程的基础。同时,使用时需特别注意...

    Sleep和Wait的区别.pdf

    `sleep`方法是`java.lang.Thread`类中的一个静态方法,其定义如下: ```java public static void sleep(long millis) throws InterruptedException { // 实现细节 } ``` 该方法接收一个参数`millis`,表示线程将...

    JAVA线程sleep()和wait()详解及实例

    JAVA线程sleep()和wait()详解及实例 JAVA线程sleep()和wait()是两个常用的线程控制方法,用于控制线程的执行和同步。本篇文章将详细介绍JAVA线程sleep()和wait()的原理、区别和实现机制,并提供实例代码以便更好地...

    java 中sleep() 和 wait() 的对比

    在Java编程中,`sleep()` 和 `wait()` 都是用来控制线程的执行流程,但它们之间存在着显著的区别。理解这些差异对于编写多线程程序至关重要。 `sleep()` 是 `java.lang.Thread` 类的一个静态方法,它使得当前正在...

    Java多线程wait和notify

    在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...

    深入理解Wait、Notify和Wait与sleep区别

    本文将深入探讨`wait()`, `notify()`以及它们与`sleep()`方法的区别,这些都是Java中与线程同步密切相关的概念。 首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。...

    JVM线程状态和Thread.sleep的实现原理探究.pdf

    在探究JVM线程状态以及Thread.sleep的实现原理时,我们首先需要了解Java线程与操作系统线程之间的关系。在Java虚拟机(JVM)中,每个线程通常都是以一对一的关系映射到操作系统线程上的。然而,尽管两者在实现上是...

    Java Thread Programming (Sams) java线程编程(含code)

    综上所述,"Java Thread Programming (Sams)"涵盖了Java线程编程的各个方面,包括基础概念、创建与管理、同步机制、异常处理、线程池和高级特性。通过阅读和实践其中的代码,开发者能深入理解Java线程编程的精髓,...

    java_Thread.rar_java thread runable_thread runable

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

    java thread

    Java提供了多种同步机制,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法以及`Lock`接口(如`ReentrantLock`)等。 11_线程同步_7_生产者消费者问题.avi 文件可能讲解了一个经典的并发设计模式...

Global site tag (gtag.js) - Google Analytics