線程的優(yōu)先級
1.線程的優(yōu)先級分為1到10,1對應(yīng)MIN_PRIORITY,10對應(yīng)MAX_PRIORITY
2.可以通過setPriority方法為線程設(shè)置優(yōu)先級,默認的優(yōu)先級為5
3.在線程啟動前設(shè)置線程的優(yōu)先級
4.優(yōu)先級高的線程不一定就先執(zhí)行完,只是在進入運行狀態(tài)的機會要高于優(yōu)先級低的線程而已
結(jié)論:我們不能指望通過設(shè)置線程的優(yōu)先級來影響線程的執(zhí)行順序,而要通過其他方法來制定線程的執(zhí)行順序
優(yōu)先級代碼示例
public class PriorityDemo {
class Thread1 extends Thread {
public Thread1(String name) {
super(name);
}
public void run() {
int random;
for (int i = 0; i < 5; i++) {
random=new Random().nextInt(100);
System.out.println(getName()+"第"+i+"次獲得隨機數(shù)"+random);
}
}
}
class Thread2 extends Thread {
public Thread2(String name) {
super(name);
}
public void run() {
int random;
for (int i = 0; i < 5; i++) {
random=new Random().nextInt(100);
System.out.println(getName()+"第"+i+"次獲得隨機數(shù)"+random);
}
}
}
public static void main(String[] args) {
PriorityDemo demo=new PriorityDemo();
Thread1 t1=demo.new Thread1("線程1");
Thread1 t2=demo.new Thread1("線程2");
t1.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.MAX_PRIORITY);
t1.start();
t2.start();
}
}
運行結(jié)果
線程1第0次獲得隨機數(shù)18
線程2第0次獲得隨機數(shù)43
線程1第1次獲得隨機數(shù)6
線程2第1次獲得隨機數(shù)6
線程1第2次獲得隨機數(shù)15
線程2第2次獲得隨機數(shù)32
線程1第3次獲得隨機數(shù)16
線程1第4次獲得隨機數(shù)73
線程2第3次獲得隨機數(shù)81
線程2第4次獲得隨機數(shù)11
當然上面只是其中的一種運行結(jié)果,列出這個結(jié)果主要是想說明,優(yōu)先級高的不一定就先執(zhí)行完
yeild
一個調(diào)用yield方法的線程,是要告訴虛擬機它樂意讓其他線程占用自己的位置,yield將當前線程由運行狀態(tài)置為就緒狀態(tài),來達到讓步的目的,但是剛進入就緒狀態(tài)的線程也可能馬上進入運行狀態(tài)。
yield代碼示例
public class YeildDemo {
class Thread1 extends Thread {
public Thread1(String name) {
super(name);
}
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + "第" + i + "次執(zhí)行");
Thread.yield();
}
}
}
class Thread2 extends Thread {
public Thread2(String name) {
super(name);
}
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + "第" + i + "次執(zhí)行");
Thread.yield();
}
}
}
public static void main(String[] args) {
YeildDemo demo = new YeildDemo();
Thread1 t1 = demo.new Thread1("線程1");
Thread1 t2 = demo.new Thread1("線程2");
t1.start();
t2.start();
}
}
上述代碼在沒有調(diào)用yeild方法的輸出結(jié)果
線程1第0次執(zhí)行
線程1第1次執(zhí)行
線程1第2次執(zhí)行
線程1第3次執(zhí)行
線程1第4次執(zhí)行
線程2第0次執(zhí)行
線程2第1次執(zhí)行
線程2第2次執(zhí)行
線程2第3次執(zhí)行
線程2第4次執(zhí)行
上述代碼在調(diào)用yeild方法的輸出結(jié)果
線程2第0次執(zhí)行
線程1第0次執(zhí)行
線程2第1次執(zhí)行
線程1第1次執(zhí)行
線程2第2次執(zhí)行
線程1第2次執(zhí)行
線程2第3次執(zhí)行
線程1第3次執(zhí)行
線程2第4次執(zhí)行
線程1第4次執(zhí)行
當然上述結(jié)果只是其中的一種運行結(jié)果,但經(jīng)過多次運行,大致就是上面的規(guī)律。
join
阻塞當前線程,直到調(diào)用join方法的線程執(zhí)行結(jié)束之后,才恢復(fù)執(zhí)行
join代碼示例
public class JoinDemo {
class Thread1 extends Thread {
public Thread1(String name) {
super(name);
}
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(getName() + "第" + i + "次執(zhí)行");
}
}
}
class Thread2 extends Thread {
public Thread2(String name) {
super(name);
}
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(getName() + "第" + i + "次執(zhí)行");
}
}
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+"執(zhí)行開始");
JoinDemo demo = new JoinDemo();
Thread1 t1 = demo.new Thread1("線程1");
Thread1 t2 = demo.new Thread1("線程2");
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"執(zhí)行結(jié)束");
}
}
上述程序在沒有調(diào)用t1和t2的join方法的運行結(jié)果如下
main執(zhí)行開始
main執(zhí)行結(jié)束
線程1第0次執(zhí)行
線程1第1次執(zhí)行
線程1第2次執(zhí)行
線程2第0次執(zhí)行
線程2第1次執(zhí)行
線程2第2次執(zhí)行
上述程序在在調(diào)用了t1和t2的join方法的運行結(jié)果如下
main執(zhí)行開始
線程1第0次執(zhí)行
線程1第1次執(zhí)行
線程1第2次執(zhí)行
線程2第0次執(zhí)行
線程2第1次執(zhí)行
線程2第2次執(zhí)行
main執(zhí)行結(jié)束