一个很简单的java线程类出错了,大虾来帮忙!

来源:百度知道 编辑:UC知道 时间:2024/06/17 14:15:43
这个程序提示我错误是无法从静态上下文引用非静态变量,怎么修改才能运行啊?
package conn_database;
public class Hello extends Thread{
int i,j,k;
Thread t1,t2,t3;
public Hello(String str){
super(str);
}
public void run(){

i=1000;
j=2000;
k=3000;
try{
t1.sleep(i);
t2.sleep(j);
t3.sleep(k);
System.out.print(t1.getName()+"休眠了"+i+"毫秒");
System.out.print(t2.getName()+"休眠了"+i+"毫秒");
System.out.print(t3.getName()+"休眠了"+i+"毫秒");
}catch(InterruptedException e){
System.out.print(e);
}
}
public static void main(String args[]){
Hello h1=new Hello("线程一");
Hello h2=new Hello("线程二");
Hello h3=new Hello("线程三");

t1,t2,t3在Hello类里定义时是非静态的,由于main方法是静态的,且静态方法只能引用静态的变量,所以上面的代码在编译时会报错说“无法从静态上下文引用非静态变量”,只要在原来的代码上将Thread t1,t2,t3改成static Thread t1,t2,t3即可通过编译
但是,我认为你的程序是有问题的,你的Hello类既然已经继承了Thread类,那么上述代码中的h1,h2,h3就是一个个的线程了,而你又把它们作为参数传给另处三个线程对象t1,t2,t3,这。。。不知道你的意思是不是这样:

package conn_database;
public class Hello implements Runnable{
int i,j,k;
Thread t1,t2,t3;

public void run(){

i=1000;
j=2000;
k=3000;
try{
t1.sleep(i);
t2.sleep(j);
t3.sleep(k);
System.out.print(t1.getName()+"休眠了"+i+"毫秒");
System.out.print(t2.getName()+"休眠了"+j+"毫秒");
System.out.print(t3.getName()+"休眠了"+k+"毫秒");
}catch(InterruptedException e){
System.out.print(e);
}
}
public static void main(String args[]){
Hello h1=new Hello();
Hello h2=new Hello();
Hello h3=new Hello();
t1 =new Thread(h1,"线程一");