Java面試必備之多執行緒基礎

Java多執行緒的應用

多執行緒的調動是

隨著cpu排程的,可以給執行緒設定優先順序,但最終還是要依靠CPU的排程,無法確定執行緒的執行順序。

Java面試必備之多執行緒基礎

多執行緒的實現方法

繼承Thread類,重寫run()方法,呼叫start開始執行緒;

實現Runnable介面,重寫run()方法,執行執行緒需要丟入Runnable實現介面類,呼叫start方法;

實現Callable介面,並用其初始化Thread,然後建立Thread例項,並呼叫start方法。

詳細說明

繼承Thread類

//建立執行緒方式一:繼承Thread類,重寫run()方法,呼叫start開始執行緒

public class demo1 extends Thread {

@Override

public void run() { //重寫run方法

for (int i = 0; i <= 99; i++) {

System。out。println(i+“在學習多執行緒”); }}

public static void main(String[] args) {

demo1 thread = new demo1();

thread。start(); //啟動run方法

for (int i = 0; i <= 99; i++) {

System。out。println(“主方法”+i+“也在學習多執行緒”); }}}

Thread本質上也是實現了Runnable介面的一個例項,它代表一個執行緒的例項,啟動執行緒的唯一方法就是透過Thread類的start()例項方法。執行結果是

隨著cpu排程的,可以給執行緒設定優先順序,但最終還是要依靠CPU的排程,無法確定執行緒的執行順序。

Java面試必備之多執行緒基礎

2.

實現Runnable介面

public class demo4 implements Runnable {

private int ticketNum = 10;

@Override

public void run() { //重寫run方法

while (true){

if (ticketNum<=0){

break;}

System。out。println(Thread。currentThread()。getName() + “拿走了第”+ ticketNum + “票。”);

ticketNum——; }}

public static void main(String[] args) {

demo4 t1 = new demo4();

demo4 t2 = new demo4();

demo4 t3 = new demo4();

new Thread(t1,“Jeri”)。start(); //執行執行緒

new Thread(t2,“Jordon”)。start();

new Thread(t3,“Knight”)。start(); }}

當自己的類已經繼承(extends)了另一個類,就無法再次extends Thread。此時,必須實現一個Runnable介面,如上所示。但實現Runnable介面的執行緒執行與extends Thread有所不同,需要new一個Thread物件,再把執行緒丟入,最後start。

舉一個龜兔賽跑的例子,烏龜不停跑,兔子偶爾會休息:

//龜兔賽跑模擬

public class demo5_race implements Runnable {

private static String winner;

@Override

public void run() {

for (int i = 0; i <= 100; i++) {

//如果是兔子,就讓他休息1ms,下面的條件表示的是i是10的倍數時兔子再休息

if (Thread。currentThread()。getName()。equals(“兔子”) && i % 10 ==0){

try {

Thread。sleep(1);

} catch (InterruptedException e) {

e。printStackTrace();} }

//判斷是否有勝利者出現了

boolean flag = gameOver(i);

if (flag){

break; }

System。out。println(Thread。currentThread()。getName() + “跑了” + i + “步”); }}

//判斷比賽是否結束了

public boolean gameOver(int step){

if (winner != null){

return true;

}{

if (step >= 100){

winner = Thread。currentThread()。getName();

System。out。println(winner + “ is winner!”);

return true; }}

return false; }

//主函,兩個執行緒

public static void main(String[] args) {

demo5_race race = new demo5_race();

new Thread(race,“烏龜”)。start();

new Thread(race,“兔子”)。start(); }}

當使用Thread。sleep()方法時,就模擬了兔子的休息。此時烏龜仍然在跑。執行結果自然就大機率是烏龜是贏家。

Java面試必備之多執行緒基礎

3。 實現Callable介面

package thread;

import java。util。concurrent。*;

public class demo6_callable implements Callable {

@Override

public Boolean call() throws Exception {

for (int i = 0; i < 10; i++) {

System。out。println(Thread。currentThread()。getName()+“call方法的執行緒正在跑。。。”); }

return true;}

public static void main(String[] args) throws ExecutionException, InterruptedException {

for (int i = 0; i < 10; i++) {

System。out。println(Thread。currentThread()。getName()+“主方法的執行緒。。。”); }

demo6_callable demo6 = new demo6_callable();

//建立執行服務

ExecutorService ser = Executors。newFixedThreadPool(3);

//提交執行

Future sub = ser。submit(demo6);

//獲取結果

Boolean aBoolean = sub。get();

//關閉服務

ser。shutdown();}}

Java面試必備之多執行緒基礎