您的位置:首页 > 移动开发 > Android开发

Android Thread interrupt 中断JAVA线程

2011-10-10 18:42 537 查看
附:关于yield与sleep

sleep() will let your thread
do nothing for a certain amount of time. Basically, your thread can’t do
anything until it is done sleeping.


yield() will cause your thread
to voluntarily let other threads in your program run. If no other
threads are ready to run, then your thread will continue.


Thread.yield() will help your
thread give time to other threads, but when other threads are free or
yield()ing will still take up 100% of the CPU. Otherwise, Thread.sleep()
is the only way to force the CPU getting a rest.


---------------------------------------------

转 Android Thread interrupt 中断JAVA线程

假如我们有一个任务如下,交给一个Java线程来执行,如何才能保证调用interrupt()来中断它呢?

Java代码

class ATask implements Runnable{

private double d = 0.0;

public void run() {

//死循环执行打印"I am running!" 和做消耗时间的浮点计算

while (true) {

System.out.println("I am running!");

for (int i = 0; i < 900000; i++) {

d = d + (Math.PI + Math.E) / d;

}

//给线程调度器可以切换到其它进程的信号

Thread.yield();

}

}

}

public class InterruptTaskTest {

public static void main(String[] args) throws Exception{

//将任务交给一个线程执行

Thread t = new Thread(new ATask());

t.start();

//运行一断时间中断线程

Thread.sleep(100);

System.out.println("****************************");

System.out.println("Interrupted Thread!");

System.out.println("****************************");

t.interrupt();

}

}

运行这个程序,我们发现调用interrupt()后,程序仍在运行,如果不强制结束,程序将一直运行下去,如下所示:

Java代码

......

I am running!

I am running!

I am running!

I am running!

****************************

Interrupted Thread!

****************************

I am running!

I am running!

I am running!

I am running!

I am running!

....

虽然中断发生了,但线程仍然在进行,离开线程有两种常用的方法:
抛出InterruptedException和用Thread.interrupted()检查是否发生中断,下面分别看一下这两种方法:
1.在阻塞操作时如Thread.sleep()时被中断会抛出InterruptedException(注意,进行不能中断的IO操作而阻塞和要获得对象的锁调用对象的synchronized方法而阻塞时不会抛出InterruptedException)

Java代码

class ATask implements Runnable{

private double d = 0.0;

public void run() {

//死循环执行打印"I am running!" 和做消耗时间的浮点计算

try {

while (true) {

System.out.println("I am running!");

for (int i = 0; i < 900000; i++) {

d = d + (Math.PI + Math.E) / d;

}

//休眠一断时间,中断时会抛出InterruptedException

Thread.sleep(50);

}

} catch (InterruptedException e) {

System.out.println("ATask.run() interrupted!");

}

}

}

程序运行结果如下:

Java代码

I am running!

I am running!

****************************

Interrupted Thread!

****************************

ATask.run() interrupted!

可以看到中断任务时让任务抛出InterruptedException来离开任务.

2.Thread.interrupted()检查是否发生中断.Thread.interrupted()能告诉你线程是否发生中断,并将清除中断状态标记,所以程序不会两次通知你线程发生了中断.

Java代码

class ATask 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;

}

}

System.out.println("ATask.run() interrupted!");

}

}

程序运行结果如下:

Java代码

I am running!

I am running!

I am running!

I am running!

I am running!

I am running!

I am running!

****************************

Interrupted Thread!

****************************

ATask.run() interrupted!

我们可结合使用两种方法来达到可以通过interrupt()中断线程.请看下面例子:

Java代码

class ATask implements Runnable{

private double d = 0.0;

public void run() {

try {

//检查程序是否发生中断

while (!Thread.interrupted()) {

System.out.println("I am running!");

//point1 before sleep

Thread.sleep(20);

//point2 after sleep

System.out.println("Calculating");

for (int i = 0; i < 900000; i++) {

d = d + (Math.PI + Math.E) / d;

}

}

} catch (InterruptedException e) {

System.out.println("Exiting by Exception");

}

System.out.println("ATask.run() interrupted!");

}

}

在point1之前处point2之后发生中断会产生两种不同的结果,可以通过修改InterruptTaskTest main()里的Thread.sleep()的时间来达到在point1之前产生中断或在point2之后产生中断.
如果在point1之前发生中断,程序会在调用Thread.sleep()时抛出InterruptedException从而结束线程.这和在Thread.sleep()时被中断是一样的效果.程序运行结果可能如下:

Java代码

I am running!

Calculating

I am running!

Calculating

I am running!

Calculating

I am running!

****************************

Interrupted Thread!

****************************

Exiting by Exception

ATask.run() interrupted!

如果在point2之后发生中断,线程会继续执行到下一次while判断中断状态时.程序运行结果可能如下:

Java代码

I am running!

Calculating

I am running!

Calculating

I am running!

Calculating

****************************

Interrupted Thread!

****************************

ATask.run() interrupted!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: