-2

我有这个代码(完整的源代码):-

class thread implements Runnable {
    int i=0;
    Thread t;
    public void main(){
     t= new Thread(this); //edited
        for(i=0;i<=5;i++){
            System.out.println(i);
        }
    }

    public void run(){
        try{
            Thread.sleep(1000); //EDITED EARLIER, was: t.sleep(1000); 
        }
        catch(InterruptedException e){
        }
    }
}

线程应该休眠 1 秒。但是,线程根本不睡觉。我哪里错了。任何帮助将不胜感激。

编辑 我现在收到以下错误->

java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:682)
at thread.main(thread.java:7)
4

3 回答 3

7

这里的根本问题是你永远不会启动线程。你的程序main在默认线程上被调用,你创建一个实例,然后什么都不做。

如果你想开始你的线程,调用t.start()(一次)。这将启动您的线程,该线程将与 JVM 在运行程序时创建的默认线程一起运行。除了两个线程同时运行之外,它们不会在您的程序中进行交互,因此您仍然会看到数字立即打印出来。根据您要执行的操作,您可能希望将循环从main移至run.

(是的,sleep是一个使当前线程休眠的静态方法。在 Java 中,通过实例引用调用静态方法在语法上是有效的,但这是个坏主意。)

因此,例如,这是您的具有最少 mods 的类(注意:您的环境似乎创建了一个实例并在main下面调用特定于实例的实例,这是非标准的,但我不理会它,因为它似乎是您的环境所做的):

class ThreadExample implements Runnable
{
    public void main(){
        Thread t= new Thread(this);
        t.start();
    }

    public void run(){
        int i;

        try{
            Thread.sleep(1000); 
            for(i=0;i<=5;i++){
                System.out.println(i);
            }
        }
        catch(InterruptedException e){
        }
    }
}

变化:

  • 对类使用标准的 Java 命名约定。
  • t中创建一个局部变量main
  • 实际上在main.
  • 调用后将循环从 移动main到。runsleep
  • i中创建一个局部变量run
  • sleep通过Thread而不是调用this

下面是一个更普通的带有 static 的示例main

class ThreadExample implements Runnable
{
    public static void main(String[] args) {
        Thread t = new Thread(new ThreadExample());
        t.start();
    }

    public void run(){
        int i;

        try{
            Thread.sleep(1000); 
            for(i=0;i<=5;i++){
                System.out.println(i);
            }
        }
        catch(InterruptedException e){
        }
    }
}

带有调试输出的实时示例

于 2013-10-22T14:13:45.120 回答
1

中的sleep方法Thread是静态的,因此应该调用Thread.sleep()它,它实际上使当前正在执行的线程进入睡眠状态,而不是您调用该方法的特定线程实例。

于 2013-10-22T14:12:42.907 回答
0

您的代码应该看起来更像这样。自从我使用线程以来已经有一段时间了,所以可能会有一些小错误,人们应该可以随意编辑。

class myThread implements Runnable
{
    public void main(){
        MyThread t= new MyThread();
        t.start();
        t.join();
    }

    public void run(){
        try{
            for(i=0;i<=5;i++){
                System.out.println(i);
                Thread.sleep(1000); 
            }
        }
        catch(InterruptedException e){
        }
    }
}
于 2013-10-22T14:21:39.363 回答