java 线程的休眠和唤醒

Treead中使用wair() 和notify()

/*需求:
       使用双线程交替打印1,2,3,4.......

                 eg:
                      T11   ------->1
                      T22   ------->2
                      T11   ------->3
                      T22   ------->4
                      T11   ------->5
                      T22   ------->6
                      T11   ------->7
                      T22   ------->8

                       ....................

*可以看出来这里的双线程是同步的*

*/

ps:我也是一个新手,有问题欢迎交流,[email protected]

我直接贴代码了 ,ceshi2.java

 1
 2 public class ceshi2 {
 3
 4     public static void main(String[] args) {
 5         // TODO Auto-generated method stub
 6         Number number =new Number();
 7         Thread t11 =new Thread(new T11(number));  //生成线程
 8         Thread t22 =new Thread(new T22(number));
 9         t11.setName("t11");  //设置线程名
10         t22.setName("t22");
11         t11.start();   //启动线程
12         t22.start();
13
14     }
15
16 }
17
18 class Number{
19     public int num=1; //number.num的起始值为1
20 }
21
22 class T11 implements Runnable{
23     private Number number;
24     T11(Number number){    //通过构造函数引入 Number对象
25         this.number=number;
26     }
27     public void run(){
28         while(number.num<30){ // 条件  number.num <30
29             synchronized(number){//通过同步语句块将异步线程变成同步线程执行以下语句,对象为number
30                 try{
31                     if(number.num %2!=0){ //打印非2的倍数
32                         Thread.sleep(500);//0.5s打印一次
33                         System.out.println(Thread.currentThread().getName()+"------>"+number.num); //获取当前线程名
34                         number.num++; //打印后num 自增
35                     }
36                     if(number.num %2==0){
37                         number.notify(); //唤醒 休眠状态下的线程T22
38                         number.wait();    //线程T11释放对象锁,让线程T22获取到对象锁,而线程T11进入休眠状态
39                     }
40                 }catch(Exception e){
41                     e.printStackTrace(); //详细的异常情况
42                 }
43             }
44         }
45     }
46 }
47
48 class T22 implements Runnable{
49     private Number number;
50     T22(Number number){
51         this.number=number;
52     }
53     public void run(){
54         while(number.num<30){
55             synchronized(number){
56                 try{
57                     if(number.num %2==0){  //打印2的倍数
58                         Thread.sleep(500);
59                         System.out.println(Thread.currentThread().getName()+"------>"+number.num);
60                         number.num++;
61                     }
62                     if(number.num %2!=0){
63                         number.notify();
64                         number.wait();
65
66                     }
67                 }catch(Exception e){
68                     e.printStackTrace();
69                 }
70             }
71         }
72     }
73 }

ceshi2.java

执行结果如下:

执行结果

时间: 2024-10-09 02:34:24

java 线程的休眠和唤醒的相关文章

Java线程的等待与唤醒

生产者和消费者必须使用同步代码块包裹起来,保证等待和唤醒只能有一个执行,同步使用的锁对象必须保证唯一 Thread中重要方法 void wait() 在其他线程调用此对象的notify()方法或notifyall()方法前,导致当前线程等待 void notify() 唤醒在此对象监视器上等待的单个线程后,会继续执行wait方法之后的代码 void notifyAll() 唤醒所有等待线程 void wait(long m)在毫秒结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到R

Java线程问题回顾(基础)

1.概念:线程是运行程序(进程)中单个顺序的小程序,一个进程可以由多个线程组成,而这多个线程共享同一个存储空间,这使得线程间的通信比较容易.在一个多进程的程序中,如果要切换到另一个进程,需要改变地址空间的位置.然而在多线程的程序中,就不会出现这种情况,因为它们位于同一个内存空间内,只需改变运行的顺序即可. 2.什么是多线程:多线程指单个程序可通过同时运行多个不同线程,以执行不同任务.所谓同时,也要依据CPU.如果是多个CPU,则并发运行,如是一个CPU,则根据系统具体情况,执行多个线程. 3.创

Java线程休眠(sleep)示例

java.lang.Thread的sleep()方法能使当前线程暂停运行一段时间(单位毫秒).需要注意的是,sleep()方法的参数不能为负,否则会抛出IllegalArgumentException异常. 除此之外,还有另一个方法sleep(long millis, int nanos),该方法可用于使当前线程暂停millis毫秒nanos纳秒.需要注意的是,参数nanos的取值范围为[0, 999999]. 下面的代码演示如何用Thread.sleep()方法令主线程暂停执行2秒. Thre

Android线程管理(三)——Thread类的内部原理、休眠及唤醒

线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用.本小节主要从以下三个方面进行分析: <Android线程管理(一)——线程通信> < Android线程管理(二)——ActivityThread > < Android线程管理(三)——Thread类的内部原理.休眠及唤醒 > 三.Thread类的内部原理.休眠及唤醒 3

多线程之Java线程阻塞与唤醒

线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题.如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节.在Java发展史上曾经使用suspend().resume()方法对于线程进行阻塞唤醒,但随之出现很多问题,比较典型的还是死锁问题.如下代码,主要的逻辑代码是主线程启动线程mt一段时间后尝试使用suspend()让线程挂起,最后使用resume()恢复线程.但现实并不如愿,执行到suspend()时将一直卡住

Java线程唤醒与阻塞常用方法有哪些?

如果线程是因为调用了wait().sleep()或者join()方法而导致的阻塞,可以中断线程,并且通过抛出InterruptedException来唤醒它:如果线程遇到了IO阻塞,无能为力,因为IO是操作系统实现的,Java代码并没有办法直接接触到操作系统.以下是详细的唤醒方法: 1. sleep() 方法 sleep(毫秒),指定以毫秒为单位的时间,使线程在该时间内进入线程阻塞状态,期间得不到cpu的时间片,等到时间过去了,线程重新进入可执行状态.(暂停线程,不会释放锁) 2.suspend

Java线程使用大全

1.线程实现 1.Thread类 构造方法: 案例代码: public class Ex10_1_CaseThread extends Thread {// 创建一个类继承(extend)Thread类 String studentName; public Ex10_1_CaseThread(String studentName) {// 定义类的构造函数,传递参数 System.out.println(studentName + "申请访问服务器"); this.studentNam

java线程详细介绍

目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1

Java深度历险(三)——Java线程?:基本概念、可见性与同步

开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于Java来说,在语言内部提供了线程的支持.但是Java的多线程应用开发会遇到很多问题.首先是很难编写正确,其次是很难测试是否正确,最后是出现问题时很难调试.一个多线程应用可能运行了好几天都没问题,然后突然就出现了问题,之后却又无法再次重现出来.如果在正确性之外,还需要考虑应用的吞吐量和性能优化的话,就