1. 程式人生 > >java基礎——執行緒的建立和狀態

java基礎——執行緒的建立和狀態

目錄

前言

程序:記憶體執行的程式。

執行緒:程序中的一個執行單元。

建立多執行緒的方式

本質都是呼叫自己寫的run方法。

1繼承thread抽象類

Thread thread = new Thread(){
    @Override
    public void run() {
        for(int i=0;i<10;i++){
            System.out.println("執行緒建立的第一種方式:"+Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
};
thread.start();

2實現Runnable介面

Thread thread2 = new Thread(new Runnable() {
    @Override
    public void run() {
        for(int i=0;i<10;i++){
            System.out.println("執行緒建立的第二種方式:"+Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
});
thread2.start();

3實現Callable介面

FuttureTask繼承RunnableFuture,
RunnableFuture繼承runnable和future。

FutureTask<Integer> ft = new FutureTask<Integer>(new Callable<Integer>() {
    @Override
    public Integer call() throws Exception {
        int i = 0;
        for(;i<10;i++){
            System.out.println("執行緒建立的第三種方式:"+Thread.currentThread().getName());
        }
        return i;
    }
});
new Thread(ft).start();

匿名內部類

改進實現runnable介面的形式

jdk8 lambda簡寫:

new Thread(()->{
            System.out.println(123);
        }).start();

完整版

new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10000; i++) {
                    System.out.println(Thread.currentThread().getName() + i);
                }
            }
        }).start();

執行緒池

  • Executors建立執行緒池

    阿里巴巴不推薦

ExecutorService service = Executors.newFixedThreadPool(2);
service.submit(new Runnable() {
    @Override
    public void run() {
        System.out.println("新執行緒執行");
    }
});

執行緒安全

多個執行緒同時對一個數據進行寫操作,會出現安全問題。

同步程式碼塊

所有執行緒都要使用同一把鎖,比如: ""

synchronized(同步鎖){
    # 需要同步操作的程式碼
}
# 強制處於waiting狀態
同步鎖.waiting();

# 喚醒處於waiting狀態的執行緒來搶鎖:
同步鎖.notify();

同步方法

對於非static方法,同步鎖就是this。
對於static方法,我們使用當前方法所在類的位元組碼物件(類名.class)

public synchronized void method(){
可能會產生執行緒安全問題的程式碼
}

鎖機制

同理:一定要使用同一把鎖!!!

Lock lock = new ReentrantLock();
ExecutorService service = Executors.newFixedThreadPool(2);
service.submit(new Runnable() {
    @Override
    public void run() {
        lock.lock();
        System.out.println(123);
        lock.unlock();
    }
});

執行緒狀態