您的位置:首页 > 编程语言 > Java开发

Java Thread.interrupt方法

2016-10-13 11:27 337 查看

Java Thread.interrupt方法

1、Thread.interrupt()方法

Thread.interrupt()方法不会终止一个正在运行的线程,只是发出一个阻塞状态,调用Thread.interruped()和isInterrupted()方法可以判断。

public class ThreadInterrup {
public static void main(String[] args) {
try {
ThreadA threadA = new  ThreadA();
threadA.start();

Thread.sleep(100);

threadA.interrupt();
System.out.println("In Thread main threadA.isInterrupted() = " + threadA.isInterrupted());
Thread.sleep(100);

System.out.println("In Thread main setPause at " + System.currentTimeMillis());
threadA.setPause(true);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

static class ThreadA extends Thread {
private volatile boolean pause;

public void run() {
while(!pause) {
}
System.out.println("In ThreadA end at " + System.currentTimeMillis());
}

public void setPause(boolean pause) {
this.pause = pause;
}
}
}

虽然调用了Thread.interrupt(),但线程并没有停止。必须调用其他方式才能停止。

In Thread main threadA.isInterrupted() = true
In Thread main setPause at 1489726867303
In ThreadA end at 1489726867303

2、Thread.interrupt()和wait()方法

如果线程正在等待状态或者即将进入等待状态,都会引发异常。

public class ThreadInterrupWait {
public static void main(String[] args) {
try {
Object lock = new Object();
ThreadA threadA = new ThreadA(lock);
threadA.start();

Thread.sleep(100);
threadA.interrupt();

Thread.sleep(100);
ThreadB threadB = new ThreadB(lock);
threadB.start();

Thread.sleep(100);
threadB.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

static class ThreadA extends Thread {
private Object lock;

public ThreadA(Object lock) {
this.lock = lock;
}

public void run() {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

System.out.println("In ThreadA end at " + System.currentTimeMillis());
}
}

static class ThreadB extends Thread {
private Object lock;

public ThreadB(Object lock) {
this.lock = lock;
}

public void run() {
synchronized (lock) {
try {
Thread.sleep(1000);
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

System.out.println("In ThreadB end at " + System.currentTimeMillis());
}
}
}

3、Thread.interrupt()和Thread.sleep()方法

如果线程正在睡眠状态或者即将进入睡眠状态,都会引发异常。

public class ThreadInterrupSleep {
public static void main(String[] args) {
try {
ThreadA threadA = new ThreadA();
threadA.start();

Thread.sleep(1000);
threadA.interrupt();

Thread.sleep(1000);
ThreadB threadB = new ThreadB();
threadB.start();

Thread.sleep(1000);
threadB.interrupt();
threadB.setPause(true);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

static class ThreadA extends Thread {

public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("In ThreadA end at " + System.currentTimeMillis());
}
}

static class ThreadB extends Thread {
private volatile boolean pause;

public void run() {
while (!pause) {
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void setPause(boolean pause) {
this.pause = pause;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: