对线程进行调度,最直接的方法是设置线程优先级,用1~10之间的整数来表示,数字越大优先级越高。也可以使用Thread类的三个静态常量表示线程优先级。
static int MAX_PRIORITY //最高优先级,相当于10 static int MIN_PRIORITY //最低优先级,相当于1 static int NORM_PRIORIY //普通优先级,相当于5
程序运行期间,就绪状态的每个线程都有优先级,如main()具有普通优先级。线程优先级不是固定不变的,可以通过Thread类的setPriority(int newPriority)方法进行设置。
举例:
public class Page364 { public static void main(String[] args) { Thread thread1=new Thread(()->{ for(int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"正在输出i:"+i); } },"优先级较低的线程"); Thread thread2=new Thread(()->{ for(int j=0;j<10;j++){ System.out.println(Thread.currentThread().getName()+"正在输出j:"+j); } },"优先级较高的线程"); thread1.setPriority(Thread.MIN_PRIORITY); thread2.setPriority(10); thread1.start(); thread2.start(); } }
使用静态方法sleep(long millis)方法使线程暂停一段时间,这样其他线程就可以得到执行机会。但该方法会抛出InterruptedException异常,因此调用该方法时应捕获异常或声明抛出异常。
举例:
public class Page365 { public static void main(String[] args) { Thread thread1=new Thread(()->{ for(int i=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"正在输出i:"+i); if(i==2){ try{ Thread.sleep(500); }catch(InterruptedException e){ e.printStackTrace(); } } } }); Thread thread2=new Thread(()->{ for(int j=0;j<10;j++){ System.out.println(Thread.currentThread().getName()+"正在输出j:"+j); } }); thread1.start(); thread2.start(); } }
线程让步可以通过yield()方法来实现,与sleep()有点类似,都可以让正在运行的线程暂停,但yield()不会阻塞该线程,它只是将线程转换成就绪状态,让系统的调度器重新调度一次,,使用yield()后,与当前线程优先级相同或更改的线程可以获得执行机会。
举例:
class YieldThread extends Thread{ public YieldThread(String name){ super(name); } public void run(){ for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+"---"+i); if(i==2){ System.out.println("线程让步"); Thread.yield(); } } } } public class Page367 { public static void main(String[] args) { Thread thread1=new YieldThread("thread1"); Thread thread2=new YieldThread("thread2"); thread1.start(); thread2.start(); } }
Thread类中提供了join()方法,在某个线程中调用其他线程的join()方法时,调用的线程将被堵塞,直到被join()方法加入的线程执行完成之后它才会继续运行。
举例:
class EmergencyThread implements Runnable{ public void run(){ for(int i=1;i<6;i++){ System.out.println(Thread.currentThread().getName()+"输入:"+i); } } } public class Page368 { public static void main(String[] args) throws InterruptedException{ Thread thread1=new Thread(new EmergencyThread(),"thread1"); thread1.start(); for(int i=1;i<6;i++){ System.out.println(Thread.currentThread().getName()+"输入:"+i); if(i==2){ thread1.join(); } } } }