標籤:catch extends ring col 守護線程 bool err 路徑 1.3
1 多線程的概述1.1 進程
- 就是正在啟動並執行程式。是系統進行資源分派和調度的獨立單位。每一個進程都有其自己的記憶體空間和系統資源。
1.2 多進程的意義?
- 單進程的電腦只能做一件事情,而我們現在的電腦可以做多件事情。例如:一邊玩遊戲,一邊聽音樂。
- 現在的電腦都支援多進程的,就可以一個時間段內執行多個任務,並且可以提高CPU的使用率。
1.3 線程
- 在一個進程內又可以執行多個任務,而這每一個任務我們就可以看成是一個線程。
- 線程是進程的執行單元(執行路徑)。
- 單線程:如果程式有一條執行路徑。
- 多線程:如果程式有多條執行路徑。
1.4 多線程的意義?
- 多線程的存在,不是提高程式的執行速度。其實是為了提高應用程式的使用率。
- 程式的執行其實都是在搶CPU的資源,即CPU的執行權。
- 多個進程是在搶這個資源,而其中的某一個進程如果執行路徑比較多的話,就有更高的幾率搶到CPU的執行權。
- 線程的執行具有隨機性。
1.5 Java程式的運行原理
- Java命令會啟動Java虛擬機器,啟動JVM,等於啟動了一個進程。 該進程會自動啟動一個主線程,然後由主線程去調用某個類的main方法,所以main方法運行在主線程中的。
- JVM啟動至少啟動了記憶體回收線程和主線程,所以是多線程的。
2 多線程的實現方案2.1 多線程的實現方案一
- 步驟:
- ①建立一個類去繼承Thread類。
- ②該子類去重寫run()方法。
- ③建立該子類的對象。
- ④啟動線程
package com.xuweiwei;/** * 多線程的實現: * 由於線程是依賴進程而存在的,所以我們應該先建立一個進程出來。 * 而進程是由系統建立的,所以,我們應該去調用系統功能去建立一個進程。 * Java是不能直接帶哦用系統功能的,所以,我們沒有辦法直接實現多線程程式。 * 但是,Java是可以調用C或C++寫好的程式去實現多線程程式。 * 由C或C++去調用系統功能建立進程,然後由Java去調用這樣的東西,然後提供一些API供我們使用。這樣,我們就可以實現多線程程式了。 */public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"= " + i); } }}
package com.xuweiwei;public class MyThreadTest { public static void main(String[] args) { MyThread t1 = new MyThread(); t1.start(); MyThread t2 = new MyThread(); t2.start(); }}2.2 擷取線程對象的名稱和設定線程對象的名稱
public final String getName()
public final void setName(String name)
public static Thread currentThread()
package com.xuweiwei;public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"= " + i); } }}
package com.xuweiwei;public class MyThreadTest { public static void main(String[] args) { MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); //設定線程的名字 t1.setName("t1"); t2.setName("t2"); t1.start(); t2.start(); }}
package com.xuweiwei;public class MyThread extends Thread { public MyThread() { } public MyThread(String name) { super(name); } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"= " + i); } }}
package com.xuweiwei;public class MyThreadTest { public static void main(String[] args) { MyThread t1 = new MyThread("t1"); MyThread t2 = new MyThread("t2"); t1.start(); t2.start(); }}
package com.xuweiwei;public class MyThreadTest { public static void main(String[] args) { System.out.println(Thread.currentThread().getName()); }}2.3 線程的控制
public static void sleep(long millis) throws InterruptedException
public final void join() throws InterruptedException
- 方法:線程禮讓即暫停當前的正在執行的線程對象,並執行其他線程。
public static void yield()
public final void setDaemon(boolean on)
public void interrupt()
package com.xuweiwei;public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"= " + i); } }}
package com.xuweiwei;public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "= " + i); } }}
package com.xuweiwei;public class MyThreadTest { public static void main(String[] args) { MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); MyThread t3 = new MyThread(); t1.setName("李淵"); t2.setName("李建成"); t3.setName("李世民"); t1.start(); try { t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } t2.start(); t3.start(); }}
package com.xuweiwei;public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "= " + i); Thread.yield(); } }}
package com.xuweiwei;public class MyThreadTest { public static void main(String[] args) { MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); MyThread t3 = new MyThread(); t1.setName("李淵"); t2.setName("李建成"); t3.setName("李世民"); t1.start(); t2.start(); t3.start(); }}
package com.xuweiwei;public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "= " + i); Thread.yield(); } }}
package com.xuweiwei;public class MyThreadTest { public static void main(String[] args) { MyThread t2 = new MyThread(); MyThread t3 = new MyThread(); t2.setName("李建成"); t3.setName("李世民"); t2.setDaemon(true); t3.setDaemon(true); t2.start(); t3.start(); Thread.currentThread().setName("李淵"); for (int i = 0; i < 3; i++) { System.out.println(Thread.currentThread().getName()+"= " + i); } }}2.4 線程的生命週期
- 建立:建立線程對象。
- 就緒:有執行資格,但是沒有執行權。
- 運行:有執行資格,有執行權。
- 阻塞:由於一些操作,讓線程處於該狀態。沒有執行資格,沒有執行權。
- 死亡:線程對象對象變成垃圾,等待被回收。
2.5 多線程的實現方式二
3 線程調度和線程式控制制
4 線程生命週期
5 死結
6 線程間通訊
7 定時器的使用
Java基礎二十二