2011-09-07周三

线程同步与多线程调度详解
本文深入探讨线程同步通信机制,包括wait()、notify()、notifyAll()方法的应用,以及如何利用Java的Timer和TimerTask实现定时任务。详细介绍了线程间的互斥锁、公共缓冲区的管理,以及多线程环境下任务的调度策略。
 

线程的调用

一、    线程同步通信

为避免死锁,就应该让线程在进入阻塞状态时尽量释放其锁定的资源,以为其他的线程提供运行的机会,Object类中定义了几个有用的方法:wait()、notify()、notifyAll()。

1wait():被锁定的对象可以调用wait()方法,这将导致当前线程被阻塞并释放该对象的互斥锁,即解除了wait()方法当前对象的锁定状态,其他的线程就有机会访问该对象。

2notify():唤醒调用wait()方法后被阻塞的线程。每次运行该方法只能唤醒一个线程。

3notifyAll():唤醒所有调用wait()方法被阻塞的线程。

限制公共缓冲区不能被两个线程同时访问,需要使用互斥锁,即用synchronized来标识同步资源。

二、Timer和TimerTask

1java.util包中的Timer和TimerTask类也可实现多线程

2Timer类实现的是类似闹钟的功能,也就是定时或者每隔一定时间间隔触发一次线程。

3TimerTask类是一个抽象类,该类实现了Runnable接口,具备多线程的能力。

4通过继承TimerTask类创建子类,使该子类获得多线程的能力,将需要多线程执行的代码书写在run方法内部,然后通过Timer类启动线程的执行。

使用Timer和TimerTask组合实现的多线程。

class TimerTask1 extends TimerTask {      

       public void run() {

              try{

                     for(int i = 0;i < 5;i++){

                            Thread.sleep(1000);

                            System.out.println("Run" + i);

                     }

              }catch(Exception e){}

       }

}

schedule()方法

public void schedule(TimerTask task,Date time):该方法的作用是在到达time指定的时间或已经超过该时间时执行线程task。
Date d = new Date(2009-1900,10-1,1,10,0,0);
t. schedule(task,d);

public void schedule(TimerTask task, Date firstTime, long period):在时间到达firstTime开始,每隔period毫秒就启动一次task指定的线程,这种方式会重复启动线程。
Date d = new Date(2009-1900,10-1,1,10,0,0);
t. schedule(task,d,20000);

 

 

 

 

2025-09-08 07:35:15.357 SECTION(cdrouter-293): Verifying the WAN side port(s) are now open 2025-09-08 07:35:15.357 INFO(cdrouter-293): Waiting 1000 milliseconds before verifying triggerPort 'app1' WAN port 30002 2025-09-08 07:35:15.361 I<<<(wan-481): 202.254.1.2 3.3.3.3 TCP 12522 > 30000 +Ack (Len=0, window=0578) 2025-09-08 07:35:15.361 INFO(remoteHost): 3.3.3.3:30000 received +Ack from 202.254.1.2:12522, seq 0xb44d2938, ack 0x75bb2edc 2025-09-08 07:35:15.361 INFO(remoteHost): Found TCP server session with 202.254.1.2:12522 state 'syn-rcvd' 2025-09-08 07:35:15.361 INFO(remoteHost): TCP received 0 bytes in TCP-Ack 2025-09-08 07:35:15.361 INFO(remoteHost): Entering 'established' state with connection 202.254.1.2:12522 2025-09-08 07:35:16.357 INFO(host2): Accepting TCP connections on port 30002 2025-09-08 07:35:16.457 INFO(cdrouter-293): Verifying tcp port 30002 is open on WAN side 2025-09-08 07:35:16.458 INFO(remoteHost): Opening new TCP session 3.3.3.3:10160 -> 202.254.1.2:30002 2025-09-08 07:35:16.458 INFO(remoteHost): Sending TCP +Syn, entering state 'syn-sent', seq 0x279b19f0, ack 0x00000000 2025-09-08 07:35:16.458 O>>>(wan-482): 3.3.3.3 202.254.1.2 TCP 10160 > 30002 +Syn (Len=0, window=0578) 2025-09-08 07:35:16.468 I<<<(lan-109): 3.3.3.3 192.168.1.2 TCP 10160 > 30002 +Syn (Len=0, window=0578) 2025-09-08 07:35:16.468 INFO(lan): Received unknown TCP packet at port 30002 from 3.3.3.3:10160 2025-09-08 07:35:16.468 INFO(lan): No TCP session or service exists on port 30002 2025-09-08 07:35:16.468 INFO(lan): Resetting connection to 3.3.3.3:10160 2025-09-08 07:35:16.468 INFO(lan): Sending TCP +Ack+Rst, entering state 'reset', seq 0x00000000, ack 0x279b19f0 2025-09-08 07:35:16.469 O>>>(lan-110): 192.168.1.2 3.3.3.3 TCP 30002 > 10160 +Ack+Rst (Len=0, window=0578) 2025-09-08 07:35:16.477 I<<<(wan-483): 202.254.1.2 3.3.3.3 TCP 30002 > 10160 +Ack+Rst (Len=0, window=0578) 2025-09-08 07:35:16.477 INFO(remoteHost): 3.3.3.3:10160 received +Ack+Rst from 202.254.1.2:30002, seq 0x00000000, ack 0x279b19f0 2025-09-08 07:35:16.477 WARNING(remoteHost): Connection was RST by peer 202.254.1.2 2025-09-08 07:35:16.478 INFO(cdrouter-293): The TCP session to port 30002 is in state 'closed' 2025-09-08 07:35:16.478 FAIL: Connection to port 30002 could not be established from WAN 2025-09-08 07:35:16.478 INFO(cdrouter-293): Closing WAN-initiated TCP connection to port 30002 翻译上文
最新发布
10-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值