在多線程的學習過程中,join,sleep,yield方法屬於比較重要的方法,下面簡單介紹一下這三個方法
- join() 等待該線程終止。
- sleep(long millis) 休眠 以毫秒值爲單位。
- yield() 線程的讓步 :暫停當前正在執行的線程對象,執行其它線程。
join()
當有線程調用join方法時,只能等待該方法終止以後,其他線程纔可以執行。當線程開啓以後,調用該方法,相當於方法調用,即
線程對象.run()
代碼如下
public class Test {
public static void main(String[] args) throws InterruptedException {
// 創建線程對象
A a = new A();
a.start();//開啓線程
a.join();//調用join方法
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
}
}
class A extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("=========" + i);
}
}
}
運行結果
沒有使用join()方法的運行結果
使用join()方法以後運行結果
通過運行代碼可知,只有當A類中代碼執行完畢以後,main方法中的循環纔會執行
sleep(long millis)
sleep(long millis) 休眠 以毫秒值爲單位。這個沒啥說的,也好理解,就是調用該方法的時候,程序會暫停,暫停時間是
minllis
毫秒
代碼實現
public class Test {
public static void main(String[] args) throws InterruptedException {
// 創建線程對象
A a = new A();
a.start();//開啓線程
Thread.sleep(1000);//程序運行到這裏會暫停1秒
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
}
}
class A extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("=========" + i);
}
}
}
注:1s=1000ms
yield()
yield()應該做的是讓當前運行線程回到就緒狀態,以允許具有相同優先級的其他線程獲得運行機會。因此,使用yield()的目的是讓相同優先級的線程之間能適當的輪轉執行。但是,實際中無法保證yield()達到讓步目的,因爲讓步的線程還有可能被線程調度程序再次選中。在大多數情況下,yield()將導致線程從運行狀態轉到可運行狀態,但有可能沒有效果。在我的調用過程中就沒有太大的效果。
- 針對兩種線程創建方法的不同調用
- 方式一
public class Test {
public static void main(String[] args) throws InterruptedException {
// 創建線程對象
A a = new A();
a.start();
for (int i = 0; i < 1000; i++) {
System.out.println(i);
}
}
}
class A extends Thread{
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
if(i%10==0) {
yield();
}
System.out.println(i+"=========");
}
}
}
- 方式二
public class Test {
public static void main(String[] args) throws Exception {
B b = new B();
Thread t = new Thread(b);
t.start();
for (int i = 1; i < 1000; i++) {
System.out.println("~~~~~~~"+i);
}
}
}
class B implements Runnable{
@Override
public void run() {
for (int i = 1; i <= 1000; i++) {
System.out.println("++++++"+i);
if(i%10==0) {
Thread.yield();
// Thread.currentThread().yield();//yield是靜態方法,使用類名.方法名()的方式調用
}
}
}
}