java多執行緒基礎知識速通

天启A發表於2024-10-14

1.執行緒和程序的區別

程序是正在執行的程式例項,每個程序包含了多個執行緒,每個現場執行不同的任務

程序都有自己的記憶體空間,而一個程序下的執行緒們則是共享記憶體空間

執行緒更加輕量,執行緒上下文切換的成本遠低於程序上下文切換的成本

2.並行與併發的區別

並行是多核CPU一般執行相應個數的執行緒

併發是執行緒輪流使用一個或多個CPU,在單CPU的狀態下,微觀上講其實他是序列的

3.建立執行緒都有哪些方式

extends Thread

public class MyThread extends Thread{
    ......
}

MyThread thread=new MyThread();

implement Runnable

pubic class MyRunnable implement Runnable{
    .......
}

MyRunnable runnable=new MyRunnable();
Thread thread=new Thread(runnable);

implement Callable<T>

public class MyCallable implement Callable<T>{
    public T call(){
        ....
        return T;
    }
}

MyCallable callable=new MyCallable();
FutureTask<T> task=new FutureTask(callable);
Thread t=new Thread(task);
...
t.start();
...
//呼叫task的get方法可以獲取執行結果
T res=task.get()

執行緒池建立執行緒

public class MyExecutors implements Runable{
    .......
}

// 建立執行緒池物件
ExecutorService executorPool=Executors.newFiexedThreadPool(3);
threadPool.submit(new MyExecutors());

// 關閉執行緒池
threadPool.shutdown

4.實現runnable和實現callable有什麼區別?

  1. callable是有返回值的,可以用Future、FutureTask拿到執行的結果
  2. run()是不允許拋異常的,但是call()是可以拋的

5.執行緒執行的run()和start()方法有什麼區別

run方法是直接執行了被封裝的程式碼,是可以執行多次的

start方法是啟動執行緒,該方法只能呼叫一次,多次會丟擲異常。不過start方法也是呼叫run方法內的邏輯

6.執行緒包含了哪些狀態

新建->執行->( 阻塞 等待 時間等待 )->終止

new一個執行緒之後是新建狀態

呼叫start()方法後執行緒進入執行狀態;在方法體內sync搶不到鎖進入阻塞狀態,獲得鎖後返回執行狀態;有sleep()就是進入時間等待狀態,;有wait()方法就是進入等待狀態,notify()方法喚醒後進入執行狀態

執行緒搶到了CPU執行權,start結束後就是終止狀態

7.如何保證執行緒按順序執行

執行緒具有join()方法,具體為等待某執行緒結束後,該執行緒才可以執行

Thread t1 = new Thread(() -> {
            System.out.println("t1 is run....");
        });
        Thread t2 = new Thread(() -> {
            try {
                t1.join();//直到t1執行結束之後t2才會執行
                System.out.println("t2 is run....");
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }


        });
        t2.start();
        t1.start();

8.什麼是notify和notifyAll

notify是隨機喚醒一個wait執行緒;notifyAll是喚醒所有wait執行緒

9.說說wait和sleep的不同

wait(),wait(long)和sleep(long)都能讓當前執行緒暫時放棄cpu的使用權,進入阻塞狀態;

sleep是靜態方法,可以直接用,wait方法是Object成員的方法,每個物件都有

wait()和wait(long)都可以被notify喚醒;sleep(long)、wait(long)都會在等待相應時間後被喚醒;都可以被打斷喚醒

wait必須要配合鎖來使用(比如sync鎖)sleep無限制;wait執行後會釋放CPU使用權,給其他執行緒使用sleep如果在sync鎖內,即使sleep了CPU使用權也未釋放

10.如何停止一個正在執行的執行緒

使用flag,讓執行緒正常退出(線上程外指定位置終止while(xxx)條件)

使用interupt方法中斷執行緒,打斷sleep,wait,join的執行緒會拋異常;打斷正常執行緒和第一種情況一樣

相關文章