看java多线程和定时器,有些疑惑,望朋友们指教,谢谢。
1.如果想同时产生多个请求,定时器是否可以实现呢?比如模拟客户向数据库发送大量请求。还是说用多线程实现。
2.产生多个线程,是否表示每个线程是一个请求?
3.定时器定时执行一个任务,比如每隔几毫秒执行一个大任务,是否可以表示多客户端的请求?这些任务是并发执行的呢还是顺序执行的?应该是一个一个顺序执行的吧,但是如果每个任务需要很长时间,那么后面的任务是否能够在定时器间隔时间后按时执行呢?
4.定时器定时执行任务时,是新建了一个线程执行新任务,还是用原来的老线程继续执行新任务呢?

解决方案 »

  1.   

    1.定时器本身内置一个线程来管理和执行任务,如果你在任务里额外启动线程,每个线程里分别发送一个请求的话,可以实现
    2.要看每个请求是否属于这个线程,如果只有一个连接,多个线程,似乎结果还是一个连接
    3.同一个定时器内的任务是一个接一个执行的,如果前面一个任务执行时间长,则会影响到后面的任务,假设一个任务里写一个死循环,那么后面的任务永远也执行不到
      排除死循环,定时器有一个休正时间的任务执行方式,添加任务到定时器的时候使用 scheduleAtFixedRate 方法就可以了
    4.见1,每个Timer内置一个线程,除非你的任务代码里另外开线程,否则只有那一个线程
      

  2.   

    谢谢redduke1202 ,
    回复:
    1。那么模拟对数据库的请求,你说是怎么的解决方法好,我看有的文章上面直接用循环建立线程,没有用到定时器。
    2。多个线程使用一个连接,他们的执行情况也应该是并发的吧,使用一个连接难道不是多用户请求吗?
      

  3.   

    wuxiao_v 
    ^_^ 
    等 级:
     发表于:2007-12-18 20:41:064楼 得分:0 
    Timer的作用是每隔一定时间启动一个线程,这个线程的起点是Timer构造函数的那个监听器     new   Timer(int   x,   xxlistner   lis) 
    就是Timer每隔x毫秒向lis发送事件,lis启动一个程序流程,这个程序的流程是你自己定义的,但是不管怎么定义他都是运行在一个新的线程上的. 
     
      

  4.   

    这是 wuxiao_v 给与的回复:  
    ^_^   
    等   级: 
      发表于:2007-12-18   20:41:064楼   得分:0   
    Timer的作用是每隔一定时间启动一个线程,这个线程的起点是Timer构造函数的那个监听器           new       Timer(int       x,       xxlistner       lis)   
    就是Timer每隔x毫秒向lis发送事件,lis启动一个程序流程,这个程序的流程是你自己定义的,但是不管怎么定义他都是运行在一个新的线程上的.   
      
    和redduke1202 说的不一样,谁的正确呢?
      

  5.   

    并发测试只能使用线程(或者多机器和多进程),
    如果模拟每个并发请求不是连续的,则可以在每个线程里面使用定时器,这样就可以模拟出如下场景
    1 XX个人员在同时使用一个系统
    2 他们按照各自的习惯,固定的发出请求如果处理过程不是很长,则极端情况,服务器会瞬间需要同时处理XX个请求,来测试并发性能!
      

  6.   

    回复:java2000_net 你的解答让我豁然开朗。
    这样说,定时器应该是一个线程吧?
      

  7.   

    to joinsearch:
    随便看看Timer和TimerTask及TimerThread的源码(都在%JDK%\src.zip里)
    你会发现Timer.java里有一个TimerThread类,就很容易搞明白了
      

  8.   

    to redduke1202,随便看看Timer和TimerTask及TimerThread的源码(都在%JDK%\src.zip里) 
    你会发现Timer.java里有一个TimerThread类,就很容易搞明白了我已经看了Timer.java里有一个TimerThread类,这样说你的说法应该是正确的?  wuxiao_v 可能有错误吧!         Timer的作用是每隔一定时间启动一个线程,这个线程的起点是Timer构造函数的那个监听器 
              new Timer(int x, xxlistner lis)   
            就是Timer每隔x毫秒向lis发送事件,lis启动一个程序流程,这个程序的流程是你自己定义的
           ,但是不管怎么定义他都是运行在一个新的线程上的.
     
    应该不会随随便便就启动新线程的吧 ?  
      
      

  9.   

    除非你在你自己的Task里启动线程,否则不会启动新线程的
      

  10.   

    我想是,害得我又进来一次!呵呵!再次提示:多线程可以模拟并发操作,但实际的工作上,很少有人连续的操作,所以定时器可以简单模拟那个思考过程。
    可以参考使用 loadRunner 进行并发性能测试的思想
      

  11.   

    java2000_net 看来你对这方面很有研究啊!