Java Thread方法
1. sleep
- sleep(时间) 指定当前线程阻塞的毫秒数
- sleep时间达到后线程进入就绪状态
- sleep可以模拟网络延时,倒计时等
/**
- sleep模拟倒计时
*/
public class BlockedSleep02 {
public static void main(String[] args) throws InterruptedException {
//倒计时
Date endTime = new Date(System.currentTimeMillis()); //当前时间
long end = endTime.getTime();
while (true){
System.out.println(new SimpleDateFormat("yyyy:hh:mm:ss").format(endTime));//输出当前时间
Thread.sleep(1000);//延时一秒
endTime = new Date(endTime.getTime()-1000);//减一秒
if(end-10000>endTime.getTime()){
break;
}
}
}
public static void test() throws InterruptedException {
//倒数10个数 1秒一个
int num=10;
while (true){
Thread.sleep(1000);
System.out.println(num--);
}
}
}
结果:
2. join
- 线程A在运行期间,可以调用线程B的join()方法,让线程B和线程A联合。这样,线程A就必须等待线程B执行完毕后,才能继续执行。
/**
* join:合并线程,插队线程
*/
public class BlockJoin01 {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(()->{
for(int i=0;i<100;i++){
System.out.println("lambda..."+i);
}
});
t.start();
for (int i=0;i<100;i++){
if (i==5){
t.join();//插队,main被阻塞了
}
System.out.println("main..."+i);
}
}
}
结果:可以看到当main到4的时候,被阻塞了,开始运行lambda
3. yield
- 礼让线程,让当前正在执行的线程暂停
- 不是阻塞线程,而是将线程从运行状态转入就绪状态
- 让CPU调度器重新调度
4. priority
- Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程优先级决定应调度哪个线程来执行
- 线程的优先级用数字表示,范围从1到10
- Thread.MIN_PRIORITY=1
- Thread.MAX_PRIORITY=10
- Thread.NORM_PRIORITY=5
优先级的设定在start()调用前
注意:优先级只是意味着获得调度的概率低,并不是绝对先调用优先级高后调用优先级低的进程。
/**
- //线程的优先级
- 1.NORM_PRIORITY 5 默认的优先级为5
- 2.MIN_PRIORITY 1
- 3.MAX_PRIORITY 10
*优先级低只是意味着获得调度的概率低,并不是绝对先调用优先级高后调用优先级低的线程
*/
public class PriorityTest {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getPriority());
MyPriority myPriority = new MyPriority();
Thread t1 = new Thread(myPriority,"王鸥");
Thread t2 = new Thread(myPriority,"张韶涵");
Thread t3= new Thread(myPriority,"肖战");
//设置优先级在启动前
t1.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(Thread.MIN_PRIORITY);
t3.setPriority(Thread.MIN_PRIORITY);
t1.start();
t2.start();
t3.start();
}
}
class MyPriority implements Runnable{
@Override
public void run() {
Thread.yield();
System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());
}
}
结果:可以看到并不是优先级高的先执行
5. 用户线程和守护线程
- 线程分为用户线程和守护线程
- 守护线程(Daemon线程):指在程序运行的时候在后台提供一种通用服务的线程,它主要被用作程序中后台调度以及支撑性工作,这种线程不是程序中不可或缺的部分。因此,当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机将会退出。同时会杀死进程中的所有守护线程。只要任何非Daemon还在运行,程序就不会终止。
- 虚拟机必须确保用户线程执行完毕
- 虚拟机不用等待守护线程执行完毕
- 守护线程的唯一用途就是为其他线程提供服务
- 当只剩下守护线程时,虚拟机就会退出
- void setDaemon(boolean isDaemon)设置该线程为守护线程还是用户线程。这一方法必须在线程启动之前调用