没实际试过代码。不过感觉你的doTask是一直循环的,没有退出,当然没办法继续作下一步的事情了。至少应该采用线程地方式来做循环才对巴。

解决方案 »

  1.   

    把你的a.demo
    那个改成线程的就行了,你这个是一直循环
      

  2.   

    请问怎样将其改为线程运行?偶一直做的是web的框架使用,对线程没有怎么看过。。谢谢!
      

  3.   

    public void init(ServletConfig config) throws ServletException
    {
    super.init(config);
    System.out.println("task start!");
    doTask();
    }
    public void doTask() {

    try {
    demo();
    loopTime();
    } catch (Exception e) {
    } }
    改成这样在看看
      

  4.   

    doTask()
    loopTime()
    demo()
    全部都放到一个线程去做定义一个线程public class dotask extends Thread{
           public void run(){}
    //那3个方法全都放在dotask这个线程里。
    //run();是入口
    }在servlet中的init中调用这个线程
    init(){
    dotask task=new dotask();
    task.start();
    }
    这样就行了
      

  5.   

    to jfy3d(剑事) :用了你的这个方法,还是原来的情况:tomcat不能往下启动。谢谢帮忙!
    to xitianjile(空想社會主義) :这个方法可以,但还有小问题,就是好像它启动了两个线程做run,比如我设置的sleep8秒,但实际中隔3秒就执行一下,而且再观察,两个中的第一个是有效的,第二个输出一个错误的结果。还望再次指教,谢谢!
      

  6.   

    你线程写得可能有问题,给个完整的例子你吧:
    import java.io.*;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.http.*;public class PrimeSearcher extends HttpServlet implements Runnable {  long lastprime = 0;                    // last prime found
      Date lastprimeModified = new Date();   // when it was found
      Thread searcher;                       // background search thread  public void init() throws ServletException {
        searcher = new Thread(this);
        searcher.setPriority(Thread.MIN_PRIORITY);  // be a good citizen
        searcher.start();
      }  public void run() {
        //               QTTTBBBMMMTTTOOO
        long candidate = 1000000000000001L;  // one quadrillion and one    // Begin loop searching for primes
        while (true) {                       // search forever
          if (isPrime(candidate)) {
            lastprime = candidate;           // new prime
            lastprimeModified = new Date();  // new "prime time"
          }
          candidate += 2;                    // evens aren't prime      // Between candidates take a 0.2 second break.
          // Another way to be a good citizen with system resources.
          try {
            searcher.sleep(200);
          }
          catch (InterruptedException ignored) { }
        }
      }  private static boolean isPrime(long candidate) {
        // Try dividing the number by all odd numbers between 3 and its sqrt
        long sqrt = (long) Math.sqrt(candidate);
        for (long i = 3; i <= sqrt; i += 2) {
          if (candidate % i == 0) return false;  // found a factor
        }    // Wasn't evenly divisible, so it's prime
        return true;
      }  public void doGet(HttpServletRequest req, HttpServletResponse res)
                                   throws ServletException, IOException {
        res.setContentType("text/plain");
        PrintWriter out = res.getWriter();
        if (lastprime == 0) {
          out.println("Still searching for first prime...");
        }
        else {
          out.println("The last prime discovered was " + lastprime);
          out.println(" at " + lastprimeModified);
        }
      }  public void destroy() {
        searcher.stop();
      }
    }
    当然你也可以把Thread searcher;  写到其它的地方,记得这个:
     public void destroy() {
        searcher.stop();
      }
      

  7.   

    参考 eureka0891()的设计把程序改成这样:/*
     * Created on 2005-1-26
     *
     * Window - Preferences - Java - Code Style - Code Templates
     */
    package com.techcreate.resources;/**
     * @author CMSDB
     * 
     * Preferences - Java - Code Style - Code Templates
     */
    import java.util.TimerTask;
    import javax.servlet.*;
    import javax.servlet.http.*;public class Task extends HttpServlet implements Runnable {
    Thread mytask;                       // background search thread
    public void init() throws ServletException {
    System.out.println("task start!");
    // doTask();
    mytask = new Thread(this);
    mytask.setPriority(Thread.MIN_PRIORITY);  // be a good citizen
    mytask.start();
    } private static XmlOutput xmloutput = XmlOutput.getXmlOutput();  public void destroy() {
      mytask.stop();
      } /* (non-Javadoc)
     * @see java.lang.Runnable#run()
     */
    public void run() {
    long delay = 8000;
    java.util.Date thisTime = new java.util.Date();
    java.util.Date lastTime = new java.util.Date();
    while (true) {
    try {
    thisTime.setTime(System.currentTimeMillis());
    //调用定时任务,隔8秒运行
    xmloutput.output();
    System.out.println("Task do!");
    Thread.sleep(delay);
    lastTime.setTime(thisTime.getTime());
    } catch (InterruptedException e) {
    }
    }
    }
    }
    控制台输出如下:
    2005-1-28 9:13:04 org.apache.coyote.http11.Http11Protocol init
    信息: Initializing Coyote HTTP/1.1 on http-8080
    Starting service Tomcat-Standalone
    Apache Tomcat/4.1.31
    WebappClassLoader: validateJarFile(E:\peopleold\defaultroot\WEB-INF\lib\j2ee.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
    task start!**************************************启动了一个线程
    2005-1-28 9:13:14 org.apache.struts.util.PropertyMessageResources <init>
    信息: Initializing, config='org.apache.struts.util.LocalStrings', returnNull=true
    2005-1-28 9:13:14 org.apache.struts.util.PropertyMessageResources <init>
    信息: Initializing, config='org.apache.struts.action.ActionResources', returnNull=true
    2005-1-28 9:13:15 org.apache.struts.util.PropertyMessageResources <init>
    信息: Initializing, config='org.apache.webapp.admin.ApplicationResources', returnNull=true
    WebappClassLoader: validateJarFile(E:\peopleold\defaultroot\WEB-INF\lib\j2ee.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
    task start!**************************************为什么又启动了一个??????
    2005-1-28 9:13:28 org.apache.coyote.http11.Http11Protocol start
    信息: Starting Coyote HTTP/1.1 on http-8080
    2005-1-28 9:13:29 org.apache.jk.common.ChannelSocket init
    信息: JK2: ajp13 listening on /0.0.0.0:8009
    2005-1-28 9:13:29 org.apache.jk.server.JkMain start
    信息: Jk running ID=0 time=16/312  config=C:\Tomcat4\conf\jk2.properties
    Task do!
    Task do!
    Task do!
    out put JiFen ok***************************这是所调用的xmloutput.output();方法的输出信息
    Task do!
    Task do!
    out put JiFen ok
    Task do!
    Task do!
    out put JiFen ok
    Task do!
    Task do!
    out put JiFen ok
    Task do!
    Task do!
    out put JiFen ok
    Task do!
    Task do!
    out put JiFen ok
    Task do!
    Task do!
    Task do!
    out put JiFen ok
    Task do!
    Task do!
    out put JiFen ok
    Task do!上面中
    out put JiFen ok
    Task do!
    为一对正确的输出,但为什么还有一个task do不去调用我让执行的方法呢?我也估计是线程设计的有问题,但自己所知不多,还望朋友指教!
    再次谢谢啦!