讓執行緒乖乖 按順序執行

2021-09-27 12:20:13 字數 2658 閱讀 1836

(1)join():「等你執行結束,我再執行」

(2)singlethreadpool:只有乙個執行緒的執行緒池,任務乖乖在佇列中等待被執行

(3)wait/notify機制:「兄弟們,醒醒,到你了」

(4)reentrantlock 的 condition 的 await/signal機制:「那個兄弟,醒醒,到你了」

接下來就這四種方式進行詳細說明

1、簡介:join(),等待執行緒結束,才能繼執行。

2、本質:讓執行緒wait在當前執行緒物件例項上,觀察join的原始碼:

public final void join() throws interruptedexception
public final synchronized void join(long millis)

throws interruptedexception

//---------重點-------------

if (millis == 0)

//--------------------------

} else

wait(delay);

now = system.currenttimemillis() - base;}}

}

解讀:阻塞當前執行緒,直到目標執行緒執行結束,如果引數是0,意味著無限等待。

3、join實現執行緒順序執行

(1)方式1:在run()中呼叫join方法。

public class m1  catch (interruptedexception e) 

system.out.println("b");});

thread t3 = new thread(() -> catch (interruptedexception e)

system.out.println("c");});

t1.start();

t3.start();

t2.start();

//輸出:a b c

}}

(2)方式2:在主方法中呼叫join

public class m2 

}

1、簡介:只有乙個執行緒的執行緒池,任務都在等待佇列中排隊,所以它們是乙個乙個執行的

2、兩種建立方式:

executorservice single=new threadpoolexecutor(1,1,0, timeunit.seconds,new linkedblockingdeque<>());

executorservice single = executors.newsinglethreadexecutor();

3、單執行緒執行緒池實現順序執行

public class m2 

}

1、簡介:有多種實現方式,這裡介紹通過乙個變數的取值來控制線程執行順序。

注意:wait/notify 要求獲得物件的monitor,所以只能在同步方法或同步**塊中使用

2、wait/notify實現執行緒順序執行

class mythread  catch (interruptedexception e) 

}system.out.println(str);

if (order<2)

flag++;

else

flag=1;

this.notifyall(); //喚起其他執行緒

}}

public class m3 

});thread t9 = new thread(new runnable()

});thread t10 = new thread(new runnable()

});t8.start();

t9.start();

t10.start();

//執行結果:a c b

}}

1、簡介:這個機制和wait/notify很像,(筆者狹隘地認為,condition一定情況下可以更加精確~)

3、await/signal實現執行緒順序執行

public class m5

system.out.println("a");

printb=true;

printa=false;

condition2.signal(); //喚醒在condition2上等待的執行緒

}catch (exception e)finally

});thread t12=new thread(() ->

system.out.println("b");

printa=true;

printb=false;

condition1.signal();

}catch (exception e)finally

});t11.start();

t12.start();

}}

如何讓執行緒按順序執行

join waits for this thread to die.等待此執行緒結束 join long millis waits at most milliseconds for this thread to die.a timeout of 0 means to wait forever.設定加...

如何讓多執行緒按順序執行

上面我們是在子執行緒中指定join 方法,我們還可以在主線程中通過join 方法讓主線程阻塞等待以達到指定順序執行的目的 package printabc.method1 第一種方法,使用object的wait和notifyall方法 public class testprint else try ...

按順序執行執行緒

condition介面提供了類似object的監視器方法,與lock配合可以實現等待 通知模式。condition定義了等待 通知兩種型別的方法,當前執行緒呼叫這些方法時,需要提前獲取到condition物件關聯的鎖。condition物件是由lock物件 呼叫lock物件的newcondition...