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

解决方案 »

  1.   

    1、可以模拟的
    2、每个线程代表一个请求
    3、每个任务都是一个线程,有顺序的,可以并发
    4、Timer是一个线程,每个TimerTask都是独立的线程
      

  2.   

    回MailBomb:
    1、可以模拟的,能否讲的具体一些?
    3.4 中的任务应该是 private TimerTask task = new TimerTask() { //定时任务
    吧?这句表示产生一个任务,并且在我们自己写的定时器的类里面,我看了一下这句没有用到创建线程的那个语句,所以
           3、每个任务都是一个线程,有顺序的,可以并发 
           4、Timer是一个线程,每个TimerTask都是独立的线程
    这个是不是不太准确啊?是否只有Timer一个线程呢?
      

  3.   

    Timer的作用是每隔一定时间启动一个线程,这个线程的起点是Timer构造函数的那个监听器  new Timer(int x, xxlistner lis)
    就是Timer每隔x毫秒向lis发送事件,lis启动一个程序流程,这个程序的流程是你自己定义的,但是不管怎么定义他都是运行在一个新的线程上的.
      

  4.   

    可以概括成一句话 Timer每隔一定时间启动一个线程执行相应的任务
      

  5.   


    如果你想模拟多用户并发可以这么做
    ..............................
    public class Twork implements Actionlistner{Twork(){}
       public void actionPerformed(){
        //在这个方法中写你的业务逻辑
       }
    }Twork tw= new Twork();
    Timer tm= new Timer (1000,tw);
    tm.start;
    ...................
    这样就可以每1秒钟启动一个你需要的处理业务逻辑的流程(在一个新的线程上).
      

  6.   

          public   void   actionPerformed(ActionEvent e){ 
            //在这个方法中写你的业务逻辑 
          } //忘了写参数了
      

  7.   

    回wuxiao_v:  
    Timer   tm=   new   Timer   (1000,tw); 
    tm.start; 
    ................... 
    这样就可以每1秒钟启动一个你需要的处理业务逻辑的流程(在一个新的线程上).
    查了一下Timer类的源码,好像不是执行新的线程吧?你从哪句看出来Timer执行任务时创建新的线程?麻烦贴一下源码看看?谢谢!
      

  8.   

    这是redduke1202给予的回复:
     
    等 级:
     发表于:2007-12-17 11:51:441楼 得分:0 
    1.定时器本身内置一个线程来管理和执行任务,如果你在任务里额外启动线程,每个线程里分别发送一个请求的话,可以实现 
    2.要看每个请求是否属于这个线程,如果只有一个连接,多个线程,似乎结果还是一个连接 
    3.同一个定时器内的任务是一个接一个执行的,如果前面一个任务执行时间长,则会影响到后面的任务,假设一个任务里写一个死循环,那么后面的任务永远也执行不到 
        排除死循环,定时器有一个休正时间的任务执行方式,添加任务到定时器的时候使用   scheduleAtFixedRate   方法就可以了 
    4.见1,每个Timer内置一个线程,除非你的任务代码里另外开线程,否则只有那一个线程 
    和wuxiao_v: 说的不一样啊。
    到底是怎么个详细情况呢?你们俩谁的说法合理一些?
     
      

  9.   

    先不做解释你先来做一个简单的实验:
    1,写一个GUI界面上边有两个textfiled tf1和tf2,两个button btn1,btn2;2,然后再用两个Timer类作两套服武器分别再两个tf上显示 i的值 ,i+=10,(btn启动用);你会发现两个tf上都的数字都会不断变化,而且激活后两个btn都处于可用状态(非假死状态).然后你在作另外一个试验1,同样的GUI和服务,只是不用Timer控制而是用循环控制数字的变化,你看看你按了一个btn之后还有没有机会按第二个.
      

  10.   

    这是redduke1202给予的回复: 
      
    等   级: 
      发表于:2007-12-17   11:51:441楼   得分:0   
    1.定时器本身内置一个线程来管理和执行任务,如果你在任务里额外启动线程,每个线程里分别发送一个请求的话,可以实现   
    2.要看每个请求是否属于这个线程,如果只有一个连接,多个线程,似乎结果还是一个连接   
    3.同一个定时器内的任务是一个接一个执行的,如果前面一个任务执行时间长,则会影响到后面的任务,假设一个任务里写一个死循环,那么后面的任务永远也执行不到   
            排除死循环,定时器有一个休正时间的任务执行方式,添加任务到定时器的时候使用       scheduleAtFixedRate       方法就可以了   
    4.见1,每个Timer内置一个线程,除非你的任务代码里另外开线程,否则只有那一个线程   
    和wuxiao_v:   说的不一样啊。 
    到底是怎么个详细情况呢?你们俩谁的说法合理一些? 
      ----------------------------------
    这不和我说的一样么
      

  11.   

    我知道你的疑惑了如果你想模拟多用户并发可以这么做 
    .............................. 
    public   class   Twork   implements   Actionlistner{ Twork(){} 
          public   void   actionPerformed(){ 
            //在这个方法中写你的业务逻辑,(业务逻辑中包括启动一个新的线程)
          } 
    } Twork   tw=   new   Twork(); 
    Timer   tm=   new   Timer   (1000,tw); 
    tm.start; 
    ................... 
    这样就可以每1秒钟启动一个你需要的处理业务逻辑的流程(在一个新的线程上).
    Timer中有一个固有的线程,这个线程的作用是启动新的线程(对于你的程序来说)
      

  12.   

    多看少说
    各位先去看看jdk下带的Timer及TimerTask的源码
    不要误导人
      

  13.   

    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启动一个程序流程,这个程序的流程是你自己定义的 
                  ,但是不管怎么定义他都是运行在一个新的线程上的. 
      
    应该不会随随便便就启动新线程的吧   ?  
      

  14.   

    哎,你还是没明白我告诉你的是什么意思. xxlistner  是监听器对吧,他每隔X秒就会受到Timer的激发,从而驱动一个流程.你的测试线程包含在这个流程里.     
      

  15.   

    public   class   Twork   implements   Actionlistner{ 
    //这个类是监听器他的作用是受到Timer的激发,然后执行actionPerformed中的方法Twork(){} 
          public   void   actionPerformed(ActionEvent   e){ 
            Userwork uk=new Userwork();
             uk.start; 
          } 
    } public class Userwork extends Thread{
    //这个类就是你传说中的客户线程
     public run(){
       //你的业务流程
      //这个方法是 Thread的固有方法,这个方法的内容会在一个新的线程里执行
    }}
    public class TestMain(){
    //这个类是程序的入口public static void main(String args[]){Twork   tw=   new   Twork(); 
    Timer   tm=   new   Timer   (1000,tw); 
    tm.start; }
    }
    //不知道这么写你还明白不,如果还不明白加我QQ53737652
      

  16.   

    随便看看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启动一个程序流程,这个程序的流程是你自己定义的   
                                ,但是不管怎么定义他都是运行在一个新的线程上的.   
        
    应该不会随随便便就启动新线程的吧       ? //确实是我错了,Timer启动的流程是运行在Timer内部固有的那个线程上的,API有时候说的不够详细,研究src确实是一种好方法.
      

  17.   

    1.如果想同时产生多个请求,定时器是否可以实现呢?比如模拟客户向数据库发送大量请求。还是说用多线程实现。 
    程序中for(int i=0;i<N;i++)
    {
      Thread thread = new Thread();
    }
    这样产生多个线程的操作已经可以模拟同时发送多个请求了,因为For循环的时间基本上是忽略不计的,用定时器当然也可以,但是个人感觉没有必要了2.产生多个线程,是否表示每个线程是一个请求? 
    当然每个线程是一个请求3.定时器定时执行一个任务,比如每隔几毫秒执行一个大任务,是否可以表示多客户端的请求?这些任务是并发执行的呢还是顺序执行的?应该是一个一个顺序执行的吧,但是如果每个任务需要很长时间,那么后面的任务是否能够在定时器间隔时间后按时执行呢? 
    在问题1中已进行了描述,For循环开多线程的时间完全可以认为这些线程是同时执行的4.定时器定时执行任务时,是新建了一个线程执行新任务,还是用原来的老线程继续执行新任务呢? 
    根据你的描述,肯定应该新建新的线程执行请求,为什么要用原来的线程呢?如果需要线程调度的话,JDK5的线程池API已经足够我们用了:
    public class MyTimerTaskThread extends TimerTask
    { @Override
    public void run() {
    // your thread method

    }

    }public static void main(String[] args) throws IOException
    {
    Timer timer = new Timer();
    timer.schedule(new MyTimerTaskThread(),100);
    }
      

  18.   

    受到了不少启发  
    我是直接这么写的  这个该怎么解释
     public static void main(String[] args) { 
         TestTimer t = new TestTimer();
         t.qunfa();
         t.qunfa2();
        
        } 

            public void qunfa() {
                Timer timer = new Timer();
                TimerTask task = new TestTimerTask();
                timer.schedule(task, 100L, 10*1000L);
            }
            
            public void qunfa2(){
             Timer timer = new Timer();
             TimerTask task = new TestTimerTask2();
             timer.schedule(task, 100L, 1*1000L);
            }