我有这个代码(完整的源代码): -
class thread implements Runnable {
int i=0;
Thread t;
public void main(){
t= new Thread(this); //edited
for(i=0;i<=5;i++){
System.out.println(i);
}
}
public void run(){
try{
Thread.sleep(1000); //EDITED EARLIER, was: t.sleep(1000);
}
catch(InterruptedException e){
}
}
}
线程应该睡1秒钟。但是,线程根本不会睡觉。我哪里错了。任何帮助将不胜感激。
修改 我现在收到以下错误 - &gt;
java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:682)
at thread.main(thread.java:7)
答案 0 :(得分:7)
这里的根本问题是你永远不会启动线程。您的程序的main
在默认线程上调用,您创建一个实例,然后不执行任何操作。
如果您想启动主题,请致电t.start()
(一次)。这将启动您的线程,该线程将与JVM在运行程序时创建的默认线程一起运行。除了两个线程同时运行之外,它们不会在您的程序中进行交互,因此您仍然会看到数字立即打印出来。根据您要执行的操作,您可能希望将循环从main
移至run
。
(是的,sleep
是一个静态方法,它使当前线程休眠。在Java中,通过实例引用调用静态方法在语法上是有效的,但它是一个坏的想法。)
例如,这里是你的类有最小mods(注意:你的环境似乎创建了一个实例,并在下面调用特定于实例的main
,这是非标准的,但是我把它放在一边,因为它似乎是你的环境所做的事情):
class ThreadExample implements Runnable
{
public void main(){
Thread t= new Thread(this);
t.start();
}
public void run(){
int i;
try{
Thread.sleep(1000);
for(i=0;i<=5;i++){
System.out.println(i);
}
}
catch(InterruptedException e){
}
}
}
的变化:
t
。main
个本地变量
main
。main
来电后,将循环从run
移至sleep
。i
。run
个本地变量
sleep
而不是Thread
致电this
。这是一个更常见的静态main
示例:
class ThreadExample implements Runnable
{
public static void main(String[] args) {
Thread t = new Thread(new ThreadExample());
t.start();
}
public void run(){
int i;
try{
Thread.sleep(1000);
for(i=0;i<=5;i++){
System.out.println(i);
}
}
catch(InterruptedException e){
}
}
}
答案 1 :(得分:1)
sleep
中的Thread
方法是静态的,因此它应该被称为Thread.sleep()
并且它实际上使当前正在执行的线程处于休眠状态,而不是您调用该方法的特定线程实例上。
答案 2 :(得分:0)
您的代码看起来应该更像这样。自从我使用线程以来已经有一段时间了,所以可能会有一些小错误让人们可以自由编辑。
class myThread implements Runnable
{
public void main(){
MyThread t= new MyThread();
t.start();
t.join();
}
public void run(){
try{
for(i=0;i<=5;i++){
System.out.println(i);
Thread.sleep(1000);
}
}
catch(InterruptedException e){
}
}
}