-2

我遇到了一个非常奇怪的问题。我的程序如下所示:

class Outter{

      class Inner extends Thread {
           public void run(){
               // do something
           }
      }

      public void func() {
           new Inner().start();
           // Thread.sleep() for a while to see if the above thread has finished
           // if not stop the thread
  }

问题是 Inner 类似乎从未真正运行过。所以 func 总是会在它做它应该做的事情之前停止它。两个线程应该并发运行,但实际上只有主线程在运行,另一个处于运行状态,但是被阻塞了。我尝试将 Inner 类更改为静态类。这次效果很好。但我仍然不知道原因,希望有人能帮忙解释一下。

4

4 回答 4

4

您的问题无法重现。

public class Outer {

    class Inner extends Thread {
        public void run() {
            System.out.println("inner");
        }
    }

    public void func() {
        new Inner().start();
        System.out.println("outer");
    }

    public static void main(String... args) {
        new Outer().func();
    }

}

这实际上完美运行并输出“<code>outer”和“<code>inner”。

于 2009-09-07T06:50:57.570 回答
0

我刚刚尝试编写一个简单的代码来显示问题,但我失败了。似乎这个问题与静态和非静态类无关,因为如果我不在外部类中使用成员变量,非静态类也可以正常工作。但是一旦我使用它,问题就会发生。重现问题并不容易。以下代码可以正常工作。

package test;

public class Tester {

    private String message = "Hello";

    private class Inner extends Thread {

        public void run(){
            try {
                System.out.println(message);
            } catch (Exception e) {
                // TODO: handle exception
            }

        }
    }

    public void func(){
        Inner inner = new Inner();
        inner.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO: handle exception
        }
        System.out.println("stop");
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new Tester().func();
    }

}
于 2009-09-07T07:11:19.207 回答
0

我最初的想法是你看到了一个线程调度“意外”。您没有向我们展示您的真实代码,因此很难确定这是否可能。我希望有一个 sleep() ,您可以在其中显示评论以防止这种情况发生,但我们看不到真正的代码。,

然而,另一个想法,你说

func 总是会在它做它应该做的事情之前停止它

这似乎很奇怪。我希望使用某种共享状态变量,同步和等待以确保两个线程就正在发生的事情达成一致。使用那些你往往会不可避免地产生控制权,以便两个线程获得时间片。

作为一个实验,我可能会在开始后添加一个 Thread.yield() 调用,看看是否有任何效果。

于 2009-09-07T06:53:18.440 回答
0
       // Thread.sleep() for a while to see if the above thread has finished
       // if not stop the thread

我的猜测是这种逻辑存在一些问题,并且您在不应该停止线程时停止了线程。当然,如果没有重现问题的示例,就无法判断。

于 2009-09-07T07:03:41.383 回答