当需要一个线程强制执行时可以使用join()方法.
- 强制执行需要线程先启动后才能强制执行
- 强制执行时其他线程会进入堵塞状态等待线程强制执行完才能进入就绪状态
实例:
public class Test11 implements Runnable { @Override public void run() { for (int i = 0; i < 1000; i++) { System.out.println("vip线程来了"+i); } } public static void main(String[] args) throws InterruptedException { Test11 test = new Test11(); Thread th=new Thread(test); for (int i = 0; i < 500;i++) { System.out.println("main"+i); if (i==200){ th.join();//强制执行 } } } }
线程中不能设置cpu调用的先后顺序,但是可以设置线程的优先级Thread类提供了setPriority()来设置线程的优先级.
Thread类的三个优先级参数常量:
MIN_PRIORITY =1 最低优先级
NORM_PRIORITY=5 默认优先级
MAX_PRIORITY=10 最高优先级
注意事项:
- 线程的优先级必须在线程启动之前进行设置
- 线程的优先级在1-10(包括1和10)超出则会报"IllegalArgumentException"异常
- 线程默认优先级是5
线程分为用户线程和守护线程,一般默认为用户线程如,main()方法就是用户线程,他有个垃圾回收的GC守护线程,Thread类中提供setDaemon(boolean on)方法可设置守护线程.
- java虚拟机会确保用户线程执行完毕
- java虚拟机不用等待守护线程执行完毕
实例:
public class Test14 { //守护线程 private static class Test1 implements Runnable{ @Override public void run() { int i=0; while(true){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("默默受守护中"+i++); } } } //用户线程 private static class Test2 implements Runnable{ @Override public void run() { for (int i = 0; i <= 36000; i++) { System.out.println("用户出生第"+i); } } } public static void main(String[] args) { Thread th=new Thread(new Test1()); //设置线程为守护线程 th.setDaemon(true); //启动守护线程 th.start(); //用户线程 Thread th1=new Thread(new Test2()); th1.start(); } }