线程的优先级
package com.tedu.thread;
/**
* 线程优先级测试
*
* 线程启动后纳入线程调度,线程时刻处于被动获取CPU时间片而无法主动获取
* 我们可以通过调整线程的优先级来最大程度的干涉线程调度分配时间片的几率
* 理论上优先级越高获取CPU时间片的次数越多
* 线程优先级有10个等级 10为最高 1为最低
* setPriority() 设置优先级
*
* @author Wildmess
*
*/
public class PriorityDemo {
public static void main(String[] args) {
Thread max = new Thread() {
@Override
public void run() {
for(int i = 0; i<100; i++) {
System.out.println("最高优先!");
}
}
};
Thread min = new Thread() {
@Override
public void run() {
for(int i = 0; i<100; i++) {
System.out.println("最低优先!");
}
}
};
Thread norm = new Thread() {
@Override
public void run() {
for(int i = 0; i<100; i++) {
System.out.println("一般!");
}
}
};
//拥有了最高的优先级
max.setPriority(Thread.MAX_PRIORITY);
//拥有了最低的优先级
min.setPriority(Thread.MIN_PRIORITY);
max.start();
norm.start();
min.start();
}
}
线程休眠
static void sleep(long ms)
该方法会让这个方法的线程阻塞指定毫秒
超时后线程会自动回到RUNNABLE状态再次并发运行
package com.tedu.thread;
import java.util.Scanner;
/**
* 线程休眠测试
* static void sleep(long ms)
* 当一个线程执行了这个方法后就会进入阻塞状态
* 并阻塞指定时间后,当超时后,线程会自动回到Runnable状态
* 登台再次获取时间片并发运行
* @author Wildmess
*
*/
public class SleepThreadDemo {
public static void main(String[] args) {
try {
Scanner scan = new Scanner(System.in);
System.out.println("请输入你要延迟的时间:");
int time = scan.nextInt();
while(time>=0) {
System.out.println(time--);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("程序结束!");
}
}
休眠唤醒
sleep方法要求我们处理中断异常
当一个线程调用sleep方法处于阻塞状态的过程中该线程的interrupt()方法被调用时,sleep方法就会抛出中断异常,此时等同于中断了睡眠阻塞。
package com.tedu.thread;
/**
* 线程中断测试 sleep方法要求处理中断异常:InterruptedException 当一个线程调用sleep方法处于阻塞状态的过程中
* 这个线程的中断方法interrupt被调用时,则sleep方法会抛出异常 此时该线程的的休眠阻塞会被打断
*
* @author Wildmess
*
*/
public class InterruptedDemo {
public static void main(String[] args) {
Thread princess = new Thread() {
@Override
public void run() {
System.out.println("睡美人在王子到来之前,一直沉睡着……");
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
System.out.println("公主醒过来了……");
}
System.out.println("王子和公主过上了幸福的生活……");
}
};
Thread prince = new Thread() {
@Override
public void run() {
System.out.println("王子开始亲公主……");
try {
for (int i = 0; i < 5; i++) {
System.out.println("王子亲了公主" + (i + 1) + "次");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("王子亲过公主了,公主要醒过来了?");
// 中断公主线程的休眠
princess.interrupt();
}
};
princess.start();
prince.start();
}
}
守护线程
package com.tedu.thread;
/**
* 守护线程
* 守护线程又称为后台线程,默认创建出来的时普通线程
* 守护线程需要调用setDaemon()方法来将一个普通线程转变为一个守护线程
*
* 守护线程和普通线程使用上没有区别,但是结束时机不一样
* 进程结束时,所有正在运行的守护线程都会强制结束
* @author Wildmess
*
*/
public class DaemonDemo {
public static void main(String[] args) {
//创建普通线程
Thread t = new Thread() {
@Override
public void run() {
for(int i=0; i<5; i++) {
System.out.println("我是被守护的线程");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("程序执行完毕!");
}
};
Thread gc = new Thread() {
public void run() {
while(true) {
System.out.println("GC开始回收……");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t.start();
// 设置守护线程,注:必须先设置为守护线程,在start守护线程
gc.setDaemon(true);// t线程什么时候结束,gc什么时候结束
gc.start();
}
}
线程插队
join方法
join是可以协调多个线程同步运行的方法
它允许调用该方法的线程进入阻塞状态,直到该方法所属的线程结束后方可解除阻塞继续向下执行
同步运行:多个线程执行存在先后顺序
异步运行:多个线程各干各的(并发操作本身就是异步)
package com.tedu.thread;
/**
*
* void join()
* 一个线程的运行插入到另一个线程之前的操作
* 被插队的线程进入阻塞状态,知道插队线程与逆行完毕以后才能阻塞状态才能取消
*
* @author Wildmess
*
*/
public class JoinThreadDemo {
public static boolean isFinish = false;
public static void main(String[] args) {
Thread dw = new Thread() {
@Override
public void run() {
System.out.println("开始下载图片");
for(int i=0; i<100; i++){
System.out.println("downloading……" + i + "%");
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("图片下载完成!");
isFinish = true;
}
};
Thread show = new Thread() {
@Override
public void run() {
try {
System.out.println("show:开始显示文字。");
Thread.sleep(2000);
System.out.println("文字显示完毕!。");
System.out.println("show:等待图片下载完毕……");
dw.join();
System.out.println("show:开始显示图片");
if(!isFinish) {
throw new RuntimeException("加载图片失败!");
}
System.out.println("show:显示图片完毕!");
} catch (Exception e) {
e.printStackTrace();
}
}
};
dw.start();
show.start();
}
}