如何在一些子线程完成之前返回一个Java线程?

时间:2009-11-27 00:33:51

标签: java multithreading

我有2个嵌套线程。

第一个线程启动第二个线程的多个实例。每个第二个线程都必须休眠一段时间(5秒)。

我想启动第一个线程并立即向用户返回一条消息,但似乎我的第一个线程等待第二个线程的所有子节点完成。

我怎样才能做到这一点?有什么帮助吗?

7 个答案:

答案 0 :(得分:7)

处理java.lang.Thread时会出现一些常见错误。

  • 在线程上调用run而不是start。这对于run方法来说并不神奇。
  • 在线程实例上调用静态方法。不幸的是,这编译。一个常见的例子是Thread.sleepsleep是一个静态方法,并且总是会睡眠当前线程,即使代码似乎是在另一个线程上调用它。

不是直接处理线程,而是使用来自java.util.concurrent的线程池通常更好。

答案 1 :(得分:1)

您应该做的是通过Executors.newCachedThreadPool()创建单个线程池。从主线程submit Runnables(任务)到池。返回主线程的Future列表。

在Java中,存在足够的框架代码,很少需要直接处理线程。

答案 2 :(得分:0)

查看代码可能会有所帮助。这取决于您放置Thread.sleep();的位置。

答案 3 :(得分:0)

就像其他人用Threads指出的那样你调用start()这是一个非阻塞调用,实际上是让线程滚动。调用run()将阻塞,直到run()方法完成。请参阅下面的示例代码;

public class Application {

    public static void main(String[] args) {
        FirstThread firstThread = new FirstThread();
        firstThread.start();
        System.out.println("Main Method ending");
    }
}


public class FirstThread extends Thread {

    public void run() {
        for(int i = 0; i < 3; i++) {
            SecondThread secondThread = new SecondThread(i);
            secondThread.start();
        }
        System.out.println("FirstThread is finishing");
    }
}

public class SecondThread extends Thread {

    private int i;

    public SecondThread(int i) {
        this.i = i;
    }

    public void run() {

        while(true) {
            System.out.println("Second thread number " + i + " doing stuff here...");
            // Do stuff here...

            try {
                Thread.sleep(5000); 
            }
            catch(InterruptedException ex){
                //ignore for sleeping}
            }
        }
    }
}

产生输出:

Main Method ending
Second thread number 0 doing stuff here...
Second thread number 1 doing stuff here...
FirstThread is finishing
Second thread number 2 doing stuff here...
Second thread number 0 doing stuff here...
Second thread number 2 doing stuff here...
Second thread number 1 doing stuff here...

答案 4 :(得分:0)

我在第一个线程和第二个线程中用'start'替换了'run'。 它现在工作正常。

感谢所有回复了有价值建议的人。

答案 5 :(得分:0)

public class FirstThread extends Thread {

    public synchronized void run() {
        for(int i = 0; i < 3; i++) {
                System.out.println("i="+i);
        }
        System.out.println("FirstThread is finishing");
    }
}

public class SecondThread extends Thread {

    public synchronized void run() {
        for(int j = 0; j < 3; i++) {
                System.out.println("j="+j);
        }
        System.out.println("Second Thread is finishing");
    }
}

public class Application {

    public static void main(String[] args) {
        FirstThread firstThread = new FirstThread();
        SecondThread a=new SecondThread()
        firstThread.start();
        a.start();

    }
}

输出将是:

i=0
i=1
i=2
i=3
FirstThread is finishing

j=0
j=1
j=2
j=3
Second Thread is finishing

答案 6 :(得分:-1)

您可以使用Synchronized关键字来完全运行一个线程

例如

public synchronized void run() //which thread to run completely
{
}