Java - 实例化对象后卡住

时间:2014-05-14 09:08:48

标签: java loops process instance

我有一个类,需要不时生成一个密钥并与客户端和服务器共享。

Kdc课程:

    protected Kdc() {
    (do stuff)
    runKdc();
} 


private void runKdc(){
    for(;;){
        generateKey();
        informClients();
        informServers();
        try {
            Thread.sleep(generationTime);
        } catch (InterruptedException e) {
            System.out.println("Sleep Interrupted");
        }
    }
}

主要课程:

    public static void main(String[] args) {
    Kdc kdc = new Kdc();
    System.out.println("done"); //Doesn't reach the line
}

现在我的问题是我需要在启动Kdc课程后做点什么而且我不能!由于无限循环,它在启动Kdc类后才会卡在Main类中。 有什么想法吗?

谢谢。

3 个答案:

答案 0 :(得分:3)

您应该在sperate线程中运行KDC。该线程将在后台运行,您的main方法将继续。

对于这个循环:

while(true){
    //do something
}

比你的for(;;){}循环要好得多。将“true”替换为“running”或“active”等布尔变量

答案 1 :(得分:2)

正如其他人所说,你应该在它自己的线程中创建Kdc,例如

package com.testingarea;

class Kdc {

  public Kdc() {
    runKdc();
  }

  private void runKdc() {
    while(true) {
      System.out.println("Running kdc");
      try {
        Thread.sleep(5000);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }

}

class RunKdc implements Runnable {

  @Override
  public void run() {
    Kdc k = new Kdc();      
  }

}

public class TestThread {

  public static void main(String[] args) {
    new Thread(new RunKdc()).start();
    System.out.println("Kdc thread started");
  } 


}

答案 2 :(得分:1)

在新线程中启动Kdc类,或创建执行kdc.runKdc()的计时器。 您可以在新线程中创建实例,如下例所示,或者只在新线程中运行runKdc()的代码。

public static void main(String[] args) 
{
    Thread keyGenerationThread= new Thread() 
    {
        @Override
        public void run() 
        {
            Kdc kdc = new Kdc();
        }
    };
    keyGenerationThread.start(); 
    System.out.println("done"); 
}