哪些情况可以终止当前线程的运行?
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循环中的循环结束为止。