要了解线程,要先了解进程
-进程
进程是指可执行程序并存放在计算机存储器的一个指令序列,它是一个动态执行的过程。(平时:)
-线程
线程是比进程还要小的运行单位,一个进程包含多个线程。(线程可以看成是一个子程序)
-法一:创建一个Thread类(位于java.lang包下),或者一个Thread子类(自定义线程类可直接继承Thread)的对象。
-法二:创建一个实现Runnable接口的类的对象。
方法
说明public void run()线程相关的代码写在该方法中,一般需要重写public void start()启动线程的方法public static void sleep(long m)线程休眠m毫秒的方法public void join()优先执行调用join()方法的线程-只有一个方法run();
-Runnable是Java中用以实现线程的接口
-任何 实现线程功能的类都必须实现该接口
线程的运行时随机的,因为我们不知道它什么时候获得CPU的使用权限,因此线程运行的结果也是随机的。
-Java不支持多继承,如果类已继承一个类就不能再继承Thread
-不打算重写Thread类的其他方法
例子一:
package Runnable; class PrintRunnable implements Runnable{ public void run() {int i=1;while(i<=10) System.out.println(Thread.currentThread().getName()+"正在运行"+(i++)+"次"); } } public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub PrintRunnable test=new PrintRunnable(); Thread t1=new Thread(test); t1.start(); PrintRunnable test2=new PrintRunnable(); Thread t2=new Thread(test2); t2.start(); } }
例一运行结果:
Thread-0正在运行1次Thread-0正在运行2次Thread-0正在运行3次Thread-0正在运行4次Thread-0正在运行5次Thread-0正在运行6次Thread-0正在运行7次Thread-0正在运行8次Thread-0正在运行9次Thread-0正在运行10次Thread-1正在运行1次Thread-1正在运行2次Thread-1正在运行3次Thread-1正在运行4次Thread-1正在运行5次Thread-1正在运行6次Thread-1正在运行7次Thread-1正在运行8次Thread-1正在运行9次Thread-1正在运行10次
例2
package Runnable; class PrintRunnable implements Runnable{ int i=1; public void run() { while(i<=10) System.out.println(Thread.currentThread().getName()+"正在运行"+(i++)+"次"); } } public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub PrintRunnable test=new PrintRunnable(); Thread t1=new Thread(test); t1.start(); // PrintRunnable test2=new PrintRunnable(); Thread t2=new Thread(test); //这里将Thread的test2转换成test,也是可以的 //Thread t2=new Thread(test); t2.start(); } }例二运行结果
Thread-0正在运行1次Thread-1正在运行2次Thread-0正在运行3次Thread-1正在运行4次Thread-0正在运行5次Thread-1正在运行6次Thread-0正在运行7次Thread-1正在运行8次Thread-0正在运行9次Thread-1正在运行10次
从运行结果可以看到,在这里线程1和线程2公用了同一个代码i。适合于多个线程处理同一个资源。
-新建(New):创建Thread或者Thread的子类时,线程处于新建状态。
-可运行(Runnable):当调用star()方法时,线程获取CPU使用权前的状态。
-正在进行(Running):获取CPU使用权后的状态,调用yield()方法,可以从正在运行状态进入到可运行状态或者当时间片用完时,也会重新进入可运行状态等待获取CPU使用权限。
-阻塞(Blocked):线程遇到干扰后(正在运行状态时可调用Thread类当中的方法,如join()、wait()、sleep()、I/O请求,进入阻塞状态。相反阻塞状态无法直接进入正在运行状态,但是当(1)等待调用join()的线程执行完毕或者(2)调用notify()或notifyAll()或(3)sleep超时或(4)I/O请求完成后,可以进入可运行状态),无法执行的状态。
-终止(Dead):终止。
Thread类的方法:public static void sleep(long millis),millis表示毫秒
作用:在指定的毫秒数内让正在执行的线程休眠(暂停执行)
参数为休眠的时间,单位是毫秒
例子:
package Thread; class MyThread3 implements Runnable{ public void run() { for(int i=1;i<=15;i++){ System.out.println(Thread.currentThread().getName()+"正在运行第"+i+"次"); //当我们想一秒钟实现一次输出可以调用Thread类中的sleep try { Thread.sleep(1000); } catch (InterruptedException e) { //当我们运行该代码块时,被打断将出现异常 e.printStackTrace(); } } } } public class SleepDemo { /** * @param args */ public static void main(String[] args) { MyThread3 mt=new MyThread3(); Thread t=new Thread(mt); t.start(); } }作用:当我们想实现计时功能或定期刷新某数据时,可以调用sleep方法。但是有一点需要注意,当我们调用完sleep方法后,系统是不会进入正在运行状态,而是进入可运行状态等待获取CPU权限,因此,当我们用该方法写时钟时,是有一定的误差,会发现时间越走越慢。sleep方法适用于时间要求不太精确的状况。
例二:
package Thread; class MyThread3 implements Runnable{ public void run() { for(int i=1;i<=15;i++){ System.out.println(Thread.currentThread().getName()+"正在运行第"+i+"次"); //当我们想一秒钟实现一次输出可以调用Thread类中的sleep try { Thread.sleep(1000); } catch (InterruptedException e) { //当我们运行该代码块时,被打断将出现异常 e.printStackTrace(); } } } } public class SleepDemo { /** * @param args */ public static void main(String[] args) { MyThread3 mt=new MyThread3(); Thread t=new Thread(mt); t.start(); Thread t1=new Thread(mt); t1.start(); } }运行结果:
Thread-0正在运行第1次Thread-1正在运行第1次Thread-1正在运行第2次Thread-0正在运行第2次Thread-0正在运行第3次Thread-1正在运行第3次Thread-0正在运行第4次Thread-1正在运行第4次Thread-0正在运行第5次Thread-1正在运行第5次Thread-0正在运行第6次Thread-1正在运行第6次Thread-0正在运行第7次Thread-1正在运行第7次Thread-0正在运行第8次Thread-1正在运行第8次Thread-0正在运行第9次Thread-1正在运行第9次Thread-0正在运行第10次Thread-1正在运行第10次Thread-0正在运行第11次Thread-1正在运行第11次Thread-0正在运行第12次Thread-1正在运行第12次Thread-0正在运行第13次Thread-1正在运行第13次Thread-0正在运行第14次Thread-1正在运行第14次Thread-0正在运行第15次Thread-1正在运行第15次
当有多个线程同时执行时,我们可以发现它是两个线程交替工作的,同时谁先执行也仍具有随机性。当线程1执行完之后,将进入休眠期,此期间,线程2有更大的机会去获取CPU的使用权限,那如果当线程2未获取使用权限而线程1“苏醒后”又要获取CPU权限,这时候怎么办?
Thread类的方法:public final void join()
作用:等待调用该方法的线程结束后才能执行。当一个线程调用join()方法后,它会优先执行,只有先执行完它之后才会执行别的线程。因此他是一种抢占资源的方法。
package Thread; class MyThread4 extends Thread{ public void run(){ for(int i=1;i<=15;i++) System.out.println(getName()+"正在执行"+i); } } public class JoinDemo { public static void main(String[] args){ MyThread4 mt=new MyThread4(); mt.start(); try { mt.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for(int i=1;i<=18;i++) System.out.println("主线程执行完毕"+i); } }
运行结果:
Thread-0正在执行1Thread-0正在执行2Thread-0正在执行3Thread-0正在执行4Thread-0正在执行5Thread-0正在执行6Thread-0正在执行7Thread-0正在执行8Thread-0正在执行9Thread-0正在执行10Thread-0正在执行11Thread-0正在执行12Thread-0正在执行13Thread-0正在执行14Thread-0正在执行15主线程执行完毕1主线程执行完毕2主线程执行完毕3主线程执行完毕4主线程执行完毕5主线程执行完毕6主线程执行完毕7主线程执行完毕8主线程执行完毕9主线程执行完毕10主线程执行完毕11主线程执行完毕12主线程执行完毕13主线程执行完毕14主线程执行完毕15主线程执行完毕16主线程执行完毕17主线程执行完毕18
通过运行结果我们可以发现,mt线程调用了join()方法之后,不管运行多少次他都是优先执行的。
Thread类的方法:public final void join(long millis)
作用:等待该线程终止的最长时间为millis毫秒。当millis=1000,当调用join()方法后,mt执行了1000毫秒,不管mt方法是否执行完毕,系统都会执行下一个线程。
例子:
package Thread; class MyThread4 extends Thread{ public void run(){ for(int i=1;i<=300;i++) System.out.println(getName()+"正在执行"+i); } } public class JoinDemo { public static void main(String[] args){ MyThread4 mt=new MyThread4(); mt.start(); try { mt.join(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for(int i=1;i<=18;i++) System.out.println("主线程执行完毕"+i); } }运行结果:
Thread-0正在执行1Thread-0正在执行2Thread-0正在执行3Thread-0正在执行4Thread-0正在执行5Thread-0正在执行6Thread-0正在执行7Thread-0正在执行8Thread-0正在执行9Thread-0正在执行10Thread-0正在执行11Thread-0正在执行12Thread-0正在执行13Thread-0正在执行14Thread-0正在执行15Thread-0正在执行16Thread-0正在执行17Thread-0正在执行18Thread-0正在执行19Thread-0正在执行20Thread-0正在执行21Thread-0正在执行22Thread-0正在执行23Thread-0正在执行24Thread-0正在执行25Thread-0正在执行26Thread-0正在执行27Thread-0正在执行28Thread-0正在执行29Thread-0正在执行30Thread-0正在执行31主线程执行完毕1主线程执行完毕2主线程执行完毕3主线程执行完毕4主线程执行完毕5主线程执行完毕6主线程执行完毕7主线程执行完毕8主线程执行完毕9Thread-0正在执行32主线程执行完毕10Thread-0正在执行33主线程执行完毕11主线程执行完毕12Thread-0正在执行34主线程执行完毕13Thread-0正在执行35主线程执行完毕14主线程执行完毕15主线程执行完毕16Thread-0正在执行36主线程执行完毕17Thread-0正在执行37主线程执行完毕18Thread-0正在执行38主线程执行完毕19Thread-0正在执行39主线程执行完毕20Thread-0正在执行40主线程执行完毕21Thread-0正在执行41主线程执行完毕22Thread-0正在执行42主线程执行完毕23Thread-0正在执行43主线程执行完毕24Thread-0正在执行44主线程执行完毕25Thread-0正在执行45主线程执行完毕26Thread-0正在执行46主线程执行完毕27Thread-0正在执行47主线程执行完毕28Thread-0正在执行48主线程执行完毕29Thread-0正在执行49主线程执行完毕30Thread-0正在执行50主线程执行完毕31Thread-0正在执行51主线程执行完毕32Thread-0正在执行52主线程执行完毕33Thread-0正在执行53主线程执行完毕34Thread-0正在执行54主线程执行完毕35Thread-0正在执行55主线程执行完毕36Thread-0正在执行56主线程执行完毕37Thread-0正在执行57主线程执行完毕38Thread-0正在执行58主线程执行完毕39Thread-0正在执行59主线程执行完毕40Thread-0正在执行60主线程执行完毕41Thread-0正在执行61主线程执行完毕42Thread-0正在执行62主线程执行完毕43主线程执行完毕44Thread-0正在执行63主线程执行完毕45Thread-0正在执行64主线程执行完毕46Thread-0正在执行65主线程执行完毕47Thread-0正在执行66主线程执行完毕48Thread-0正在执行67主线程执行完毕49Thread-0正在执行68Thread-0正在执行69Thread-0正在执行70Thread-0正在执行71Thread-0正在执行72Thread-0正在执行73Thread-0正在执行74主线程执行完毕50Thread-0正在执行75主线程执行完毕51Thread-0正在执行76主线程执行完毕52Thread-0正在执行77主线程执行完毕53Thread-0正在执行78主线程执行完毕54主线程执行完毕55主线程执行完毕56主线程执行完毕57Thread-0正在执行79Thread-0正在执行80Thread-0正在执行81主线程执行完毕58Thread-0正在执行82主线程执行完毕59Thread-0正在执行83主线程执行完毕60Thread-0正在执行84主线程执行完毕61Thread-0正在执行85主线程执行完毕62Thread-0正在执行86主线程执行完毕63Thread-0正在执行87主线程执行完毕64Thread-0正在执行88主线程执行完毕65Thread-0正在执行89主线程执行完毕66Thread-0正在执行90主线程执行完毕67Thread-0正在执行91主线程执行完毕68Thread-0正在执行92主线程执行完毕69Thread-0正在执行93主线程执行完毕70Thread-0正在执行94主线程执行完毕71Thread-0正在执行95主线程执行完毕72Thread-0正在执行96主线程执行完毕73Thread-0正在执行97主线程执行完毕74Thread-0正在执行98主线程执行完毕75Thread-0正在执行99主线程执行完毕76Thread-0正在执行100主线程执行完毕77Thread-0正在执行101主线程执行完毕78Thread-0正在执行102主线程执行完毕79Thread-0正在执行103主线程执行完毕80Thread-0正在执行104主线程执行完毕81Thread-0正在执行105主线程执行完毕82Thread-0正在执行106主线程执行完毕83Thread-0正在执行107主线程执行完毕84Thread-0正在执行108主线程执行完毕85Thread-0正在执行109主线程执行完毕86Thread-0正在执行110主线程执行完毕87Thread-0正在执行111主线程执行完毕88主线程执行完毕89主线程执行完毕90主线程执行完毕91主线程执行完毕92主线程执行完毕93主线程执行完毕94Thread-0正在执行112主线程执行完毕95Thread-0正在执行113主线程执行完毕96Thread-0正在执行114主线程执行完毕97Thread-0正在执行115主线程执行完毕98Thread-0正在执行116主线程执行完毕99Thread-0正在执行117主线程执行完毕100Thread-0正在执行118主线程执行完毕101Thread-0正在执行119主线程执行完毕102Thread-0正在执行120主线程执行完毕103Thread-0正在执行121主线程执行完毕104Thread-0正在执行122主线程执行完毕105Thread-0正在执行123主线程执行完毕106Thread-0正在执行124主线程执行完毕107Thread-0正在执行125主线程执行完毕108Thread-0正在执行126主线程执行完毕109Thread-0正在执行127主线程执行完毕110Thread-0正在执行128主线程执行完毕111Thread-0正在执行129主线程执行完毕112Thread-0正在执行130主线程执行完毕113Thread-0正在执行131主线程执行完毕114Thread-0正在执行132主线程执行完毕115Thread-0正在执行133主线程执行完毕116Thread-0正在执行134主线程执行完毕117Thread-0正在执行135主线程执行完毕118Thread-0正在执行136主线程执行完毕119Thread-0正在执行137主线程执行完毕120Thread-0正在执行138Thread-0正在执行139Thread-0正在执行140Thread-0正在执行141主线程执行完毕121主线程执行完毕122Thread-0正在执行142主线程执行完毕123Thread-0正在执行143主线程执行完毕124Thread-0正在执行144主线程执行完毕125Thread-0正在执行145主线程执行完毕126Thread-0正在执行146主线程执行完毕127Thread-0正在执行147主线程执行完毕128Thread-0正在执行148主线程执行完毕129Thread-0正在执行149主线程执行完毕130Thread-0正在执行150主线程执行完毕131Thread-0正在执行151主线程执行完毕132Thread-0正在执行152主线程执行完毕133Thread-0正在执行153主线程执行完毕134Thread-0正在执行154主线程执行完毕135Thread-0正在执行155主线程执行完毕136Thread-0正在执行156主线程执行完毕137Thread-0正在执行157主线程执行完毕138Thread-0正在执行158主线程执行完毕139Thread-0正在执行159主线程执行完毕140Thread-0正在执行160主线程执行完毕141Thread-0正在执行161Thread-0正在执行162Thread-0正在执行163Thread-0正在执行164Thread-0正在执行165Thread-0正在执行166Thread-0正在执行167Thread-0正在执行168Thread-0正在执行169Thread-0正在执行170Thread-0正在执行171Thread-0正在执行172Thread-0正在执行173主线程执行完毕142主线程执行完毕143主线程执行完毕144主线程执行完毕145Thread-0正在执行174Thread-0正在执行175Thread-0正在执行176Thread-0正在执行177Thread-0正在执行178主线程执行完毕146Thread-0正在执行179主线程执行完毕147Thread-0正在执行180主线程执行完毕148Thread-0正在执行181主线程执行完毕149Thread-0正在执行182主线程执行完毕150Thread-0正在执行183主线程执行完毕151Thread-0正在执行184主线程执行完毕152Thread-0正在执行185主线程执行完毕153Thread-0正在执行186主线程执行完毕154Thread-0正在执行187主线程执行完毕155Thread-0正在执行188主线程执行完毕156Thread-0正在执行189主线程执行完毕157Thread-0正在执行190主线程执行完毕158Thread-0正在执行191主线程执行完毕159Thread-0正在执行192主线程执行完毕160Thread-0正在执行193主线程执行完毕161Thread-0正在执行194主线程执行完毕162Thread-0正在执行195主线程执行完毕163Thread-0正在执行196主线程执行完毕164Thread-0正在执行197主线程执行完毕165Thread-0正在执行198主线程执行完毕166Thread-0正在执行199主线程执行完毕167Thread-0正在执行200主线程执行完毕168Thread-0正在执行201主线程执行完毕169Thread-0正在执行202主线程执行完毕170Thread-0正在执行203主线程执行完毕171Thread-0正在执行204主线程执行完毕172Thread-0正在执行205主线程执行完毕173Thread-0正在执行206主线程执行完毕174Thread-0正在执行207主线程执行完毕175Thread-0正在执行208主线程执行完毕176Thread-0正在执行209主线程执行完毕177Thread-0正在执行210主线程执行完毕178Thread-0正在执行211主线程执行完毕179Thread-0正在执行212主线程执行完毕180Thread-0正在执行213主线程执行完毕181Thread-0正在执行214主线程执行完毕182Thread-0正在执行215主线程执行完毕183Thread-0正在执行216主线程执行完毕184Thread-0正在执行217主线程执行完毕185Thread-0正在执行218主线程执行完毕186Thread-0正在执行219主线程执行完毕187Thread-0正在执行220主线程执行完毕188Thread-0正在执行221主线程执行完毕189Thread-0正在执行222主线程执行完毕190Thread-0正在执行223主线程执行完毕191Thread-0正在执行224主线程执行完毕192Thread-0正在执行225主线程执行完毕193主线程执行完毕194主线程执行完毕195主线程执行完毕196主线程执行完毕197主线程执行完毕198主线程执行完毕199主线程执行完毕200主线程执行完毕201主线程执行完毕202主线程执行完毕203主线程执行完毕204主线程执行完毕205主线程执行完毕206主线程执行完毕207主线程执行完毕208主线程执行完毕209主线程执行完毕210主线程执行完毕211主线程执行完毕212Thread-0正在执行226主线程执行完毕213Thread-0正在执行227主线程执行完毕214Thread-0正在执行228主线程执行完毕215Thread-0正在执行229主线程执行完毕216Thread-0正在执行230主线程执行完毕217Thread-0正在执行231主线程执行完毕218Thread-0正在执行232主线程执行完毕219Thread-0正在执行233主线程执行完毕220Thread-0正在执行234主线程执行完毕221Thread-0正在执行235主线程执行完毕222Thread-0正在执行236主线程执行完毕223Thread-0正在执行237主线程执行完毕224Thread-0正在执行238主线程执行完毕225主线程执行完毕226主线程执行完毕227主线程执行完毕228主线程执行完毕229Thread-0正在执行239主线程执行完毕230Thread-0正在执行240主线程执行完毕231Thread-0正在执行241主线程执行完毕232Thread-0正在执行242主线程执行完毕233Thread-0正在执行243主线程执行完毕234Thread-0正在执行244主线程执行完毕235Thread-0正在执行245主线程执行完毕236Thread-0正在执行246主线程执行完毕237Thread-0正在执行247主线程执行完毕238Thread-0正在执行248主线程执行完毕239Thread-0正在执行249主线程执行完毕240Thread-0正在执行250主线程执行完毕241Thread-0正在执行251主线程执行完毕242Thread-0正在执行252主线程执行完毕243Thread-0正在执行253主线程执行完毕244Thread-0正在执行254主线程执行完毕245Thread-0正在执行255主线程执行完毕246Thread-0正在执行256Thread-0正在执行257Thread-0正在执行258Thread-0正在执行259主线程执行完毕247Thread-0正在执行260主线程执行完毕248主线程执行完毕249主线程执行完毕250主线程执行完毕251主线程执行完毕252主线程执行完毕253主线程执行完毕254主线程执行完毕255主线程执行完毕256主线程执行完毕257主线程执行完毕258主线程执行完毕259Thread-0正在执行261主线程执行完毕260Thread-0正在执行262主线程执行完毕261Thread-0正在执行263主线程执行完毕262Thread-0正在执行264主线程执行完毕263Thread-0正在执行265主线程执行完毕264Thread-0正在执行266主线程执行完毕265Thread-0正在执行267主线程执行完毕266Thread-0正在执行268主线程执行完毕267Thread-0正在执行269主线程执行完毕268Thread-0正在执行270主线程执行完毕269Thread-0正在执行271主线程执行完毕270Thread-0正在执行272主线程执行完毕271Thread-0正在执行273主线程执行完毕272主线程执行完毕273Thread-0正在执行274Thread-0正在执行275Thread-0正在执行276Thread-0正在执行277主线程执行完毕274Thread-0正在执行278主线程执行完毕275Thread-0正在执行279主线程执行完毕276Thread-0正在执行280主线程执行完毕277Thread-0正在执行281主线程执行完毕278Thread-0正在执行282主线程执行完毕279Thread-0正在执行283主线程执行完毕280Thread-0正在执行284主线程执行完毕281Thread-0正在执行285主线程执行完毕282Thread-0正在执行286主线程执行完毕283Thread-0正在执行287主线程执行完毕284Thread-0正在执行288主线程执行完毕285Thread-0正在执行289主线程执行完毕286Thread-0正在执行290主线程执行完毕287Thread-0正在执行291主线程执行完毕288Thread-0正在执行292主线程执行完毕289Thread-0正在执行293主线程执行完毕290Thread-0正在执行294主线程执行完毕291Thread-0正在执行295主线程执行完毕292Thread-0正在执行296主线程执行完毕293Thread-0正在执行297主线程执行完毕294Thread-0正在执行298主线程执行完毕295Thread-0正在执行299主线程执行完毕296Thread-0正在执行300主线程执行完毕297主线程执行完毕298主线程执行完毕299主线程执行完毕300
从运行结果我们可以发现,我们设置millis=1,当mt线程执行到第31次后,线程进入休眠状态但仍未结束,然后执行主线程,此后mt线程和主线程将随机获取CPU的使用权限,继续执行直至线程结束。
-Java为线程类提供了10个优先级
-优先级可以同整数1-10表示,超过范围会抛出异常
-主线程默认优先级为5
-数字越大,优先级别越高
-可以使用优先级常量表示优先级
(1)MAX_PRIORITY:线程的最高优先级10
(2)MIN_PRIORITY:线程的最低优先级1
(3)NORM_PRIORITY:线程的默认优先级5
-优先级相关的方法:
方法说明public void getPriority()获取线程优先级的方法public void setPriority(int newPriority)设置线程优先级的方法 例子: package Thread; class MyThread5 extends Thread{ private String name; public MyThread5(String name){ this.name=name; } public void run(){ for(int i=1;i<=10;i++){ System.out.println("线程"+name+"正在执行"+i); } } } public class Priority { public static void main(String [] args){ //获取主线程的优先级 int mainPriority=Thread.currentThread().getPriority(); System.out.println("主线程的优先级"+mainPriority); MyThread5 mt1=new MyThread5("线程1"); mt1.setPriority(Thread.MAX_PRIORITY); mt1.start(); System.out.println("线程1的优先级"+mt1.getPriority()); MyThread5 mt2=new MyThread5("线程2"); mt2.setPriority(1); mt2.start(); } }
运行结果:
主线程的优先级5线程1的优先级10线程线程1正在执行1线程线程1正在执行2线程线程1正在执行3线程线程1正在执行4线程线程1正在执行5线程线程2正在执行1线程线程1正在执行6线程线程2正在执行2线程线程1正在执行7线程线程2正在执行3线程线程1正在执行8线程线程2正在执行4线程线程1正在执行9线程线程2正在执行5线程线程1正在执行10线程线程2正在执行6线程线程2正在执行7线程线程2正在执行8线程线程2正在执行9线程线程2正在执行10
从运行结果我们会发现即使线程1的优先级比主程序优先级高,系统仍会先输出“线程1的优先级为10”,然后再执行线程2,而且,即使线程1比线程2的优先级高,仍有可能在线程1执行的过程中执行线程2。这与系统环境有关!
-各个线程是通过竞争CPU时间而获得运行机会的
-各线程什么时候得到CPU时间,占用多久,是不可预测的
-一个正在运行着的线程在什么地方被暂停是不确定的
-
转载于:https://www.cnblogs.com/jhl123/p/7640148.html