Java 中傳統多線程

@TOCjava

Java 中傳統多線程

線程初識

線程的概念

當代操做系統中,能夠獨立併發執行的基本單元 輕量:佔用系統資源極少 獨立:操做系統能夠獨立調度和分派的基本單元 共享:共享進程中的資源多線程

實現線程

繼承Thread類,重寫run方法 實現Runnable接口,實現run方法併發

package com.xc.test.threadtest;

public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread threadA = new ThreadA();
        threadA.setName("ThreadA");
        threadA.start();

        ThreadB threadB = new ThreadB();
        Thread thread = new Thread(threadB);
        thread.start();

        while (true) {
            Thread.sleep(1000);
            System.out.println(3);
        }

    }
}

class ThreadA extends Thread {
    public void run() {
        while (true) {
            System.out.println(this.getName() + ":" + 2);
        }
    }
}

class ThreadB implements Runnable {
    public void run() {
        while (true) {
            System.out.println(4);
        }

    }
}

線程的生命週期

新建:線程剛剛建立完畢 可運行:啓動線程後 運行:操做系統調度 阻塞/等待:等待某種資源或時間片到 消亡:退出run方法this

經常使用API

類方法:針對當前運行線程 currentThread:獲取當前運行線程的引用 yield:使得當前運行線程放棄當前時間片 sleep:使得當前運行線程休眠多少時間(單位是毫秒)spa

實例方法:針對指定線程 start:啓動線程 setP:設置/獲取線程優先級 setName/getName:設置/獲取線程名稱 setD:設置/獲取線程的幽靈狀態操作系統

線程同步

多線程共享數據的問題

多個線程併發訪問同一個數據時,容易發生數據狀態不穩定 使用鎖機制完成線程同步(同-協同,步-調用順序)線程

package com.xc.test.threadtest;

public class SysDemo {
    public static void main(String[] args) {
        Data data = new Data();
        new ThreadC(data).start();
        new ThreadC(data).start();
    }
}

class Data {
    int i;

    public void process() {
        System.out.println("Before:" + i);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        i++;
        System.out.println("After:" + i);
    }
}

class ThreadC extends Thread {
    Data data;

    public ThreadC(Data data) {
        this.data = data;
    }

    public void run() {
        super.run();
        while (true) {
            data.process();
        }
    }
}
Before:0
Before:0
After:1
After:2
Before:2
Before:2
After:3
Before:4
After:4

線程同步及實現機制

每一個類一把鎖,每一個對象一把鎖 只有獲取鎖的線程能夠進入同步區域code

class Data {
    int i;

    public void process() {
        synchronized (this) {//對象鎖(任意對象),同步塊
            System.out.println("Before:" + i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
            i++;
            System.out.println("After:" + i);
        }
    }
}
class Data {
    int i;

    public synchronized void process() {//對象鎖(當前對象),同步方法
        System.out.println("Before:" + i);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
        }
        i++;
        System.out.println("After:" + i);
    }
}
Before:0
After:1
Before:1
After:2
Before:2
After:3
Before:3
After:4

線程間通信

線程間通信模型

wait:使當前線程進入指定對象的等待池 notify:從指定對象等待池中喚醒一個等待線程 notifyAll:從指定對象等待池中喚醒所有等待線程 只有得到該對象的鎖後才能夠調用上述方法對象

線程中通信的實現

生產者:synchronized(obj){...;obj.notifyAll()} 消費者:synchronized(obj){obj.wait(),...;}繼承

package com.xc.test.threadtest;

public class WnDemo {
    public static void main(String[] args) {
        Data2 data2 = new Data2();
        new Producer(data2).start();
        new Consumer(data2).start();
    }
}

class Data2 {
    int i;

    public void add() {
        synchronized (this) {
            i++;
            if (i % 5 == 0) {
                notifyAll();
            }
        }
    }

    public void sub() {
        synchronized (this) {
            try {
                this.wait();
            } catch (InterruptedException e) {
            }
        }
        System.out.println("Before:" + i);
        i++;
        System.out.println("After:" + i);
    }
}

class Consumer extends Thread {
    Data2 data;

    public Consumer(Data2 data) {
        this.data = data;
    }

    public void run() {
        while (true) {
            while (true) {
                data.sub();
            }
        }
    }
}

class Producer extends Thread {
    Data2 data;

    public Producer(Data2 data) {
        this.data = data;
    }

    public void run() {
        while (true) {
            while (true) {
                data.add();
            }
        }
    }
}
相關文章
相關標籤/搜索