java线程甚至在启动调用后仍未运行

时间:2014-10-15 18:00:38

标签: java multithreading

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实例。

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

当我运行程序时,我看到了我的system.out,也没有任何异常。

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

2 个答案:

答案 0 :(得分:2)

您刚开始Thread,而不是ThreadTestThread' run()方法无效。相反,请创建并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,那么它永远不会通知自己。

答案 1 :(得分:1)

您有未使用的ThreadTest(thread)类数组。

我认为你想要这个:

public static void main(String[] args) {
    ThreadTest[] threads = new ThreadTest[10];
    int i = 0;
    for(int i=0;i<threads.length;i++) {
        threads[i] = new ThreadTest();
        threads[i].start();
    }
}