Java-实例化对象后卡住
我有一个类,需要不时生成一个密钥,并与客户机和服务器共享 Kdc类:Java-实例化对象后卡住,java,loops,process,instance,Java,Loops,Process,Instance,我有一个类,需要不时生成一个密钥,并与客户机和服务器共享 Kdc类: protected Kdc() { (do stuff) runKdc(); } private void runKdc(){ for(;;){ generateKey(); informClients(); informServers(); try { Thread.sleep(generationT
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类之后,它只是卡在主类中。
有什么想法吗
谢谢。您应该在sperate线程中运行KDC。该线程将在后台运行,主方法将继续 对于这个循环:
while(true){
//do something
}
比for(;){}循环好得多。将“true”替换为布尔变量,如“running”或“active”您应该在高速线程中运行KDC。该线程将在后台运行,主方法将继续 对于这个循环:
while(true){
//do something
}
比for(;){}循环好得多。将“true”替换为布尔变量,如“running”或“active”在新线程中启动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");
}
在新线程中启动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");
}
例如,正如其他人所说,您应该在自己的线程中创建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");
}
}
例如,正如其他人所说,您应该在自己的线程中创建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");
}
}
显示Kdc类的代码。。它是否在一个单独的线程中运行??。如果没有,那么您将使主线程在无限循环中休眠。(我认为您没有生成一个新线程来运行无限循环)在一个新线程中启动Kdc类,或者创建一个计时器来执行
Kdc.runKdc()
为什么要使用这个循环?永远不要使用这样的循环@零-他可以用它。但他必须使用新的线程。这样的循环很常见,否则您如何期望任务反复运行?请使用ScheduledExecutorService。并找到了解Java.show Kdc类代码的人。。它是否在一个单独的线程中运行??。如果没有,那么您将使主线程在无限循环中休眠。(我认为您没有生成一个新线程来运行无限循环)在一个新线程中启动Kdc类,或者创建一个计时器来执行Kdc.runKdc()
为什么要使用这个循环?永远不要使用这样的循环@零-他可以用它。但他必须使用新的线程。这样的循环很常见,否则您如何期望任务反复运行?请使用ScheduledExecutorService。找一个懂Java的人,虽然我同意这一点Kdc
constructor永远不会退出,这让我感觉不对。如果Kdc
没有在其构造函数中调用runKdc()
(或者如果线程在构造函数中被剥离),我更愿意这样做,而我确实同意这一点Kdc
constructor永远不会退出,这让我感觉不对。如果Kdc
没有在其构造函数中调用runKdc()
(或者如果线程是在构造函数中分离出来的),我更愿意这样做,非常感谢!我尝试过线程,但我做了new-Thread(new-RunKdc()).run()代码>而不是.start()。再次感谢你!非常感谢你!我尝试过线程,但我做了new-Thread(new-RunKdc()).run()代码>而不是.start()。再次感谢你!