@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(); } } } }