哪些情况可以终止当前线程的运行?
A、抛出一个例外时。
B、当该线程调用sleep()方法时。
C、当创建一个新线程时。
D、当一个优先级高的线程进入就绪状态时
A!pthread_clean_pop抛出一个例外,线程终止!也可以通过其他线程调用pthread_cancel()函数来终止另一个线程,当前选择选A
D并不是终止,而是抢占,进程是资源分配的最基本单位,同一个进程创建的不同线程共享这些资源。所以这些线程能使用的资源是有限的。当某一个线程优先级比较高时,它就会抢占其他线程的资源,导致其他线程没有资源可用,会造成阻塞,直到那个优先级高地线程使用完。一般创建线程的时候都会有个属性绑定,在那里边就可以设置线程的响应速度。我这样讲,你明白了吗?所以D根本根本不能教终止,只能叫挂起当前线程!
终止线程执行的两种方法
一旦一个线程处于Runnable状态,它就会连续地执行,直到run()方法结束。Thread早期版本中有一个stop()方法,可以随时终止线程的执行。由于stop()方法在JDK的较新版本中已建议不再使用。因此,要使用一些技巧来实现这一手段。就我目前接触到的来看,要分两种情况:
1.对于继承Thread类构造线程的情况
public class ClassName extends Thread { private boolean running=false; //该类的域和方法 //一般包含如下start()方法用于启动线程 public void start() { running=true; super.start(); } //一般包含如下halt()方法用于终止线程 public void halt() { running=false; } //在run()方法中使用类似于下例的while循环 public void run() { while(running) { /*线程要执行的代码*/ } } }
2.对于实现Runnable接口构造线程的情况
注意,下面的stop()和start()方法不是自动被调用的,它们仅提供一种很方便的手段去终止或者启动线程。
public class ClassName extends Thread { private Thread threadName=null; //该类的域和方法 //一般包含如下start()方法用于启动线程 public void start() { if(threadName==null) { threadName=new Thread(this); threadName.start(); } } //一般包含如下stop()方法用于终止线程 public void stop() { threadName=null; } //在run()方法中使用类似于下例的while循环 public void run() { Thread currentThread=Thread.currentThread(); while(threadName==currentThread) { /*有适当的代码调用threadName.sleep(sleeptime)或者threadName.yied()*/ } } }
Notice:
如果while循环中还使用了循环,此时调用自定义的halt()或者stop()方法可能不能立即终止线程,而是会运行到while循环中的循环结束为止。