static void sleep(long millis) 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。
public class ThreadSleep extends Thread{ @Override public void run() { for (int i =0;i<100;i++){ //static void sleep(long millis) 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(getName()+","+i); } } } public class ThreadSleepDemo { public static void main(String[] args) { ThreadSleep ts1= new ThreadSleep(); ThreadSleep ts2= new ThreadSleep(); ThreadSleep ts3= new ThreadSleep(); ts1.setName("曹操"); ts2.setName("刘备"); ts3.setName("孙权"); ts1.start(); ts2.start(); ts3.start(); } }
每一秒运行三个线程,但是先后顺序仍然是随机的。
void join() 等待这个线程死亡。
假设三个线程分别为:皇帝,皇子1和皇子2,那么在夺取皇位这件事情上的优先级是,只有皇帝死后,皇子1和皇子2才能争夺皇位。
public class ThreadJoin extends Thread{ @Override public void run() { for (int i =0;i<100;i++){ System.out.println(getName()+","+i); } } } public class ThreadJoinDemo { public static void main(String[] args) { //void join() 等待这个线程死亡。 ThreadJoin th1 = new ThreadJoin(); ThreadJoin th2 = new ThreadJoin(); ThreadJoin th3 = new ThreadJoin(); th1.setName("皇帝"); th2.setName("皇子1"); th3.setName("皇子2"); th1.start(); try { th1.join(); } catch (InterruptedException e) { e.printStackTrace(); } th2.start(); th3.start(); } }
等到“皇帝”这个线程结束后,两个“皇子"线程才能运行。
void setDaemon(boolean on) 将此线程标记为守护线程。当运行的唯一线程都是守护进程线程时,Java虚拟机将退出。
将当前线程设置为主线程,将另外两个线程设置为守护线程,当主线程结束时,剩下运行的线程都是守护线程,此时JVM将退出。
public class ThreadSetDaemon extends Thread{ @Override public void run() { for (int i =0;i<100;i++){ System.out.println(getName()+","+i); } } } public class ThreadSetDaemonDemo { public static void main(String[] args) { //void setDaemon(boolean on) 将此线程标记为守护线程。当运行的唯一线程都是守护进程线程时,Java虚拟机将退出。 ThreadSetDaemon tsd1 = new ThreadSetDaemon(); ThreadSetDaemon tsd2 = new ThreadSetDaemon(); Thread.currentThread().setName("主线程"); tsd1.setName("线程1"); tsd2.setName("线程2"); //设置守护线程 tsd1.setDaemon(true); tsd2.setDaemon(true); tsd1.start(); tsd2.start(); for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+","+i); } } }
当主线程运行结束时,线程1和线程2也会结束掉。