我是多线程的新手,并试图清除我的基础知识。
public class SleepExample extends Thread {
private int counter = 0;
@Override
public void run() {
try {
counter++;
System.out.println("Value of counter "+counter);
System.out.println("Thread going in sleep "+Thread.currentThread().getName());
Thread.currentThread().run();
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
System.out.println("Thread out of sleep "+Thread.currentThread().getName());
}
public static void main(String[] args) {
new SleepExample().start();
new SleepExample().start();
Test test = new Test();
Thread t = new Thread(test);
t.start();
}
}
//another class implementing runnable
public class Test implements Runnable {
@Override
public void run() {
System.out.println("In Test runnable method");
}
}
当我运行此代码时,我的SleepExample运行方法在行
之后递归调用自身Thread.currentThread().run();
属于SleepExample(Thread -0,Thread -1)和 它用于运行线程t的Test类的方法。
我无法理解Thread.currentThread()。run();
的用法P.S。 - 我读了它的java doc,所以我实现了一个runnable
答案 0 :(得分:1)
我无法理解Thread.currentThread()。run();
的用法
你不应该直接打电话。来自Thread.start()您应该使用start()
来呼叫run()
,就是这样。
使该线程开始执行; Java虚拟机调用此线程的运行方法。
结果是两个线程同时运行:当前线程(从调用start方法返回)和另一个线程(执行其run方法)。
不止一次启动线程永远不合法。特别是,一旦完成执行,线程可能无法重新启动。
你已经在run()
中运行所以你应该只在你说出你为什么这么做的时候打电话给它,即使这样它看起来像一个bug或者很容易混淆我建议你使用一个循环代替。
当我运行此代码时,我的SleepExample运行方法在行
之后递归调用自身
你有一个调用自己的方法,所以你应该期待这种情况发生。在这方面Thread
没有什么特别之处。它就像方法中的任何其他递归调用一样。