我刚开始使用Java的多线程概念。我写了一个小的Java程序但是,我真的无法理解它的行为。
public class Mythread implements Runnable{
@Override
public void run() {
System.out.println("mythread: ");
Thread t=new Thread(this,"thread1");
for(int i=1;i<5;i++)
{
System.out.println("in for of myThread");
try {
t.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class ThreadTest {
public static void main(String[] args) {
System.out.println("in main thread");
Mythread mythread=new Mythread();
Thread thread=new Thread(mythread,"thread0");
thread.start();
for(int i=1;i<5;i++)
{
System.out.println("main class: "+i);
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
现在当我执行上面的程序时,我看到当thread1进入休眠状态时,thread0也会进入休眠状态。
t.sleep(1000);
thread1
和thread0
是否是同一个帖子?
另外,我没有在我的代码中的任何地方启动thread1
那么为什么线程会进入睡眠状态?
我只是多线程的初学者并且参考了Java The Complete参考书。
答案 0 :(得分:3)
Thread.sleep(...)
方法导致当前线程休眠。它是一个静态方法,而不是实例方法。
一个线程没有安全的方法强制另一个线程休眠。
你也犯了其他错误:
创建Thread
的子类通常是个错误。建议的线程方法是编写一个实现Runnable
的类,并创建java.lang.Thread
的实例作为线程。更好的是,使用线程池,fork-join池或ExecutorService
实例。
在此:
Mythread mythread = new Mythread();
Thread thread = new Thread(mythread, "thread0");
您实际上正在使用mythread
个对象(仅)Runnable
。
您在run()
方法中创建的线程永远不会被使用...因为您永远不会启动它们。但是,如果你这样做,会有一个线程爆炸...因为你用this
作为Runnable
实例化它们,而run()
方法只会创建更多的线程。
存在多种Java样式违规行为......从您选择Mythread
作为类名开始。
回答你的问题:
是thread1,thread0是指同一个线程吗?
没有
此外,我还没有在我的代码中的任何地方启动thread1,那么为什么线程会进入睡眠状态呢?
事实上,正在睡觉的是thread0。如果你改变了
System.out.println("in for of myThread");
到
System.out.println("in for of myThread: " + Thread.currentThread());
你会看到......
答案 1 :(得分:0)
Thread.sleep
是一个类方法,而不是实例方法。实际上,您正在调用Tread.sleep(1000)
,这是对线程类的请求,以使当前正在执行的线程处于休眠状态。
因此尽管thread1
和thread2
不是同一个线程,但每个线程请求休眠1秒钟。
顺便说一句。任何好的IDE都会告诉你'应该以静态方式访问Thread类型的静态方法sleep(long)“。
答案 2 :(得分:0)
不,WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB
和thread0
不是同一个帖子。如前面的答案中所述,sleep方法是静态的,它会将当前线程置于休眠状态。由于thread1从未进入可运行状态,因此没有进入睡眠状态的概念,这是你的thread0将要进入休眠状态。
有关此问题的进一步参考,您可以参考here以获得有关线程状态流和从另一个线程创建新线程的清晰见解。