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(); } }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(); } }