我想出了这个简单的方法来获取正在运行的线程的状态,但我遇到了一些问题。如果有人可以帮助我修复它们或给我一个新的方法来做到这一点,那就太好了。这是我的Thread类代码:
public class DLThread implements Runnable{
Thread dl;
String dlurl;
boolean running;
public DLThread(String cmd) {
dl = new Thread(this, "DL Thread");
dl.start();
dlurl = cmd.substring(3);
}
@Override
public void run() {
running = true;
System.out.println("Thread is Running");
try{
Methods.downloadExecute(dlurl);
running = false;
System.out.println("Thread done");
}
catch(Exception e){
e.printStackTrace();
running = false;
System.out.println("Thread done");
}
}
public boolean getState() {
return running;
}
}
我使用布尔“运行”来确定线程是否正在运行或是否已完成。这是我试图称之为的地方:
if ( cmd.startsWith( "dl=" )) {
boolean running = DLThread.getState();
if(running){
new DLThread(cmd);
}
}
我收到此错误:non-static method getState() cannot be referenced from a static context
答案 0 :(得分:3)
Thread.State与TERMINATED状态检查有什么关系?您必须导出运行状态(不是NEW
,而不是TERMINATED
),但它让我更加可靠。
答案 1 :(得分:1)
getState()
是实例方法(非静态),因此您只能在实例上调用它。
你需要一个实例,所以尝试这样的事情:
DLThread t = new DLThread ();
boolean running = t.getState();
或从另一个实例方法中调用它:
boolean running = getState();
答案 2 :(得分:0)
这是您的问题,您正在尝试以静态方式访问非静态运行的字段。
简单的解决方案是使其静止:
public class DLThread implements Runnable{
Thread dl;
String dlurl;
static boolean running;
public DLThread(String cmd) {
dl = new Thread(this, "DL Thread");
dl.start();
dlurl = cmd.substring(3);
}
@Override
public void run() {
running = true;
System.out.println("Thread is Running");
try{
Methods.downloadExecute(dlurl);
running = false;
System.out.println("Thread done");
}
catch(Exception e){
e.printStackTrace();
running = false;
System.out.println("Thread done");
}
}
public static boolean getState() {
return running;
}
}
无论如何,你必须小心这种控制,因为它不是线程安全的。