线程总是存在优先级,优先级范围在1~10之间,线程默认优先级是5; JVM线程调度程序是基于优先级的抢先调度机制; 在大多数情况下,当前运行的线程优先级将大于或等于线程池中任何线程的优先级
package unit_fifteen; public class TestPriority { public static void main(String[] args) { Thread tone = new ThreadOne(); // 线程的默认优先级为5,这里设置为10 tone.setPriority(10); // 获取tone的优先级 System.out.println(tone.getPriority()); // 当前线程为Main()主线程 System.out.println(Thread.currentThread().getName()); tone.start(); Thread ttwo = new ThreadTwo(); ttwo.start(); } } class ThreadOne extends Thread { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("我是第" + i + "个阿三!"); System.out.println(Thread.currentThread().getName() + i); } } } class ThreadTwo extends Thread { @Override public void run() { for (int j = 0; j < 5; j++) { System.out.println("我是第" + j + "个李四!"); } } }
注意:当设计多线程应用程序的时候,一定不要依赖于线程的优先级。因为线程调度优先级操作是没有保障的,只能把线程优先级作用作为一种提高程序效率的方法,但是要保证程序不依赖这种操作
Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。当线程睡眠时,它入睡在某个地方,在苏醒之前不会返回到可运行状态。当睡眠时间到期,则返回到可运行状态;sleep()是静态方法,只能控制当前正在运行的线程
package unit_fifteen; public class MyThread extends Thread { public void run() { for (int i = 0; i <=20; i++) { if ((i) % 10 == 0) { System.out.println("-------" + i); } System.out.print(i); try { //睡眠1秒 Thread.sleep(1000); System.out.print("线程睡眠1秒!\n"); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { new MyThread().start(); } }
Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中
Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作
package unit_fifteen; public class MyThread { public static void main(String[] args) { for (int i = 0; i < 5; i++) { new ThreadOneDemo().start(); if (i == 3) { try { // 调用join()方法 Thread t = new ThreadTwoDemo(); t.start(); t.join(); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } } } class ThreadOneDemo extends Thread { public void run() { System.out.println("我正在运行!"); } } class ThreadTwoDemo extends Thread { public void run() { for (int j = 0; j < 5; j++) { System.out.println("我是新加入者!"); } } }