public class TestSynchronization {

public static void main(String[] args) {
    ThreadTest[] threads = new ThreadTest[10];
    int i = 0;
    for(Thread th : threads) {
        th = new Thread(Integer.toString(i++));
        th.start();
    }
}

class ThreadTest extends Thread {

    TestSynchronization ts = new TestSynchronization();

    public /*synchronized */void run() {
        synchronized(this) {
            ts.testingOneThreadEntry(this);
            System.out.println(new Date());
            System.out.println("Hey! I just came out and it was fun... ");
            this.notify();
        }
    }

}

private synchronized void testingOneThreadEntry(Thread threadInside) {
    System.out.println(threadInside.getName() + " is in");
    System.out.println("Hey! I am inside and I am enjoying");
    try {
        threadInside.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
 }

}




我无法启动ThreadTest实例。

我希望ThreadTest的run方法在行th.start();执行后立即执行,这是main方法中的一个。

运行程序时,我看不到system.out或任何异常。

我也调试了,但可以看到循环运行了10次。

最佳答案

您只是启动了Thread,而不是ThreadTestThreadrun()方法不执行任何操作。而是创建并start()一个ThreadTest

for(ThreadTest th : threads) {
   th = new ThreadTest(Integer.toString(i++));
   th.start();
}


您还需要在ThreadTest类中使用一个单参构造函数,该构造函数将采用传递给它的String

public ThreadTest(String msg){
    super(msg);
}


您还需要制作ThreadTeststatic,以便可以从static main方法访问该嵌套类。

static class ThreadTest extends Thread {


但是,您将等待所有Thread等待。按照编写的方式,此代码将在每个wait内部调用Thread,但永远不会到达notify。必须在notify上调用Thread方法,以便从另一个Thread进行通知。如果正在wait,则它将永远无法通知自己。

10-04 10:31