看了上面的结果,你可能会认为线程的执行顺序是依次执行的,但是那只是一般情况,千万不要用以为是线程的执行机制;影响线程执行顺序的因素有几点:首先看看前面提到的优先级别
public class MyThread implements Runnable { public void run() { System.out.println("My Name is "+Thread.currentThread().getName()); } public static void main(String[] args) { Thread t1=new Thread(new MyThread()); Thread t2=new Thread(new MyThread()); Thread t3=new Thread(new MyThread()); t2.setPriority(Thread.MAX_PRIORITY);//赋予最高优先级 t1.start(); t2.start(); t3.start(); } } |
再看看结果:
My Name is Thread-1
My Name is Thread-0
My Name is Thread-2
线程的优先级分为10级,分别用1到10的整数代表,默认情况是5。上面的t2.setPriority(Thread.MAX_PRIORITY)等价与t2.setPriority(10)
然后是线程程序本身的设计,比如使用sleep,yield,join,wait等方法(详情请看JDKDocument)
public class MyThread implements Runnable { public void run() { try { int sleepTime=(int)(Math.random()*100);//产生随机数字, Thread.currentThread().sleep(sleepTime);//让其休 一定时间,时间又上面sleepTime决定 //public static void sleep(long millis)throw InterruptedException (API) System.out.println(Thread.currentThread().getName()+" 睡了 "+sleepTime); }catch(InterruptedException ie)//由于线程在休 可能被中断,所以调用sleep方法的时候需要捕捉异常 { ie.printStackTrace(); } } public static void main(String[] args) { Thread t1=new Thread(new MyThread()); Thread t2=new Thread(new MyThread()); Thread t3=new Thread(new MyThread()); t1.start(); t2.start(); t3.start(); } } |
执行后观察其输出:
Thread-0 睡了 11
Thread-2 睡了 48
Thread-1 睡了 69
上面的执行结果是随机的,再执行很可能出现不同的结果。由于上面我在run中添加了休眠语句,当线程休眠的时候就会让出cpu,cpu将会选择执行处于runnable状态中的其他线程,当然也可能出现这种情况,休眠的Thread立即进入了runnable状态,cpu再次执行它。
相关链接: