在静态类new一个实例时,会产生这个错误,参考下面这篇文章时,发现static main却可以。于是我做了一些实验,发现也报错了。经过调试,发现如果你要在static 函数里面new一个类,这个类必须是独立的一个java 文件。
对Thread.interrupt()方法很详细的介绍
http://blog.sina.com.cn/s/blog_6ca570ed01016mti.html
例子:
AsynTask.java
public class AsynTask implements Runnable{
private double d = 0.0;
public void run() {
while(!Thread.interrupted()){
System.out.println("I am running!");
for (int i = 0; i < 900000; i++) {
d = d + (Math.PI + Math.E) / d;
}
}
}
}
TestThread.java代码
public class TestThread {
public static void main(String[] args) throws Exception{
//将任务交给一个线程执行
Thread t = new Thread(new AsynTask());
t.start();
//运行一断时间中断线程
Thread.sleep(100);
System.out.println("****************************");
System.out.println("Interrupted Thread!");
System.out.println("****************************");
t.interrupt();
t = new Thread(new AsynTask());
t.start();
//运行一断时间中断线程
Thread.sleep(100);
System.out.println("****************************");
System.out.println("Interrupted Thread!");
System.out.println("****************************");
t.interrupt();
}
}
把static函数中的new实例对应的类,用Java file单独定义,就通过编译了。
原理不大懂,但大概可以知道,java中的static函数不能new一个子类,却可以new一个独立的类。
这样,我在Android设计时遇到的难题就解决了。我想在一个公用的static类中new一个实例,那这个实例对应的类定义不要放在这个公用类,而单独出来就可以了。
例如下图,BTController提供很多static 方法供Activity调用
但线程被终止后,必须new,如下
public static void startConnection(String pAddr){
mBTAdp.cancelDiscovery();
if(mBTSocket!=null){
//close old socket first
if(mBTSocket.isConnected()){
try {
mBTSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
stopGlobalThread();
mConnectThread = new ConnectThread();
mConnectThread.setAddress(pAddr);
mConnectThread.start();
}
private static void stopGlobalThread() {
if(mConnectThread!=null){
mConnectThread.interrupt();
mConnectThread = null;
}
}
因为每次startConnection(),都必须重启ConnectThread,因此必须在static startConnection()中new ConnectThread(),通过上面的实验,我把子类ConnectThread()单独出来了。题目中的错误就不报了。
接着这个实验,下一篇会总结下Android中如何中断一个线程并重启。