Java线程的中断与插入
interrupt() 方法
其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。
实例: 先输出10次线程名,然后等待20秒,在主方法调用interrupt()方法。
class ThreadTest extends Thread {
@Override
public void run() {
while (true) {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
try {
Thread.sleep(20000);
System.out.println(Thread.currentThread().getName());
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + " 中断");
}
}
}
}
主方法
public static void main(String[] args) {
ThreadTest t = new ThreadTest();
t.start();
t.setName("子线程");
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
t.interrupt(); // 当执行到这里就会中断T线程的休眠
System.out.println("线程优先级:"+t.getPriority());
}
运行结果
从结果中可以看出,在调用interrupt()方法时,直接跳过睡眠,进行下一次循环。
join()与yield()
join():线程的插队。插队的线程一旦插队成功,则肯定先执行玩插入的线程所有的任务,即让“主线程”等待“子线程”结束之后才能继续运行 。
yield():线程的礼让。让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定礼让成功。
实例:创建一个子线程,每隔0.5秒输出hello,输出10此,主线程每个1秒输出hi,输出10次。要求两个线程通知执行,当主线程输出5此后,就让子线程运行完毕,主线程在继续。
class ThreadTest extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(500); // 休眠0.5秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("hello------" + i + " threadName:" + Thread.currentThread().getName());
}
}
}
主方法
public static void main(String[] args) throws InterruptedException {
ThreadTest t = new ThreadTest();
t.start();
t.setName("子线程");
for (int i = 0; i < 10; i++) {
Thread.sleep(500);
System.out.println("hi " + i + " threadName:" + Thread.currentThread().getName());
if (i == 5){
System.out.println("~~~~~~t.join()~~~~~~");
// join 线程插队
t.join();
// 不一定成功
// Thread.yield();
}
}
}
运行结果
从运行结果可以看出,在前5次,主线程和子线程之间是交替运行的,当条用t.join()方法之后,主线程等待子线程,子线程完全运行完毕之后开始主线程。
线程常用的方法一
方法名 | 说明 |
---|---|
setName | 设置线程名,使之与参数name相同 |
getName | 返回线程的名称 |
start | 使用线程开始执行;java虚拟机底层调用线程的start0方法 |
run | 调用线程对象的run方法 |
setPriority | 更改线程的优先级 |
getPriority | 获取线程的优先级 |
sleep | 在指定的毫秒数内瓤正在执行的线程睡眠(暂停执行) |
interrupt | 中断线程 |
线程常用的方法二
方法名 | 说明 |
---|---|
yield | 线程的礼让。让出cpu,让其他线程执行,但礼让的时间不切丁,所以也不一定礼让成功 |
join | 线程的插队。插队的线程一旦插队成功,则肯定先执行玩插入的线程所有的任务。 |