我有2个嵌套线程。
第一个线程启动第二个线程的多个实例。每个第二个线程都必须休眠一段时间(5秒)。
我想启动第一个线程并立即向用户返回一条消息,但似乎我的第一个线程等待第二个线程的所有子节点完成。
我怎样才能做到这一点?有什么帮助吗?
答案 0 :(得分:7)
处理java.lang.Thread
时会出现一些常见错误。
run
而不是start
。这对于run
方法来说并不神奇。Thread.sleep
。 sleep
是一个静态方法,并且总是会睡眠当前线程,即使代码似乎是在另一个线程上调用它。不是直接处理线程,而是使用来自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
{
}