第三次学JAVA再学不好就吃翔(part115)--多线程
生活随笔
收集整理的這篇文章主要介紹了
第三次学JAVA再学不好就吃翔(part115)--多线程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
學習筆記,僅供參考,有錯必糾
文章目錄
- 多線程
- 多線程引入
- 什么是線程
- 多線程并行和并發的區別
- Java程序運行原理
- 多線程的實現方式
- 多線程實現的方式1
- 多線程程序實現的方式2
- 以上兩種實現方式的區別
- 獲取和設置線程名字
- 獲取當前線程對象
- 休眠線程
- 守護線程
- 加入線程
- 禮讓線程(略)
多線程
多線程引入
什么是線程
線程是程序執行的一條路徑, 一個進程中可以包含多條線程;多線程并發執行可以提高程序的效率,可以同時完成多項工作。
多線程并行和并發的區別
并行就是兩個任務同時運行,就是甲任務進行的同時,乙任務也在進行;
并發是指兩個任務都請求運行,而處理器只能按受一個任務,就把這兩個任務安排輪流進行,由于時間間隔較短,使人感覺兩個任務都在運行。
Java程序運行原理
Java命令會啟動java虛擬機,啟動JVM就等于啟動了一個應用程序,也就是啟動了一個進程;
該進程會自動啟動一個主線程,然后主線程去調用某個類的main方法;
同時,JVM啟動至少啟動了垃圾回收線程和主線程,所以是多線程的。
多線程的實現方式
多線程實現的方式1
- 繼承Thread
- 定義繼承Thread類的類;
- 重寫run方法;
- 把新線程要做的事寫在run方法中;
- 創建線程對象;
- 開啟新線程, 內部會自動執行run方法。
- 舉個例子
package com.guiyang.restudy3;public class D2Thread {public static void main(String[] args) {MyThread mt = new MyThread(); //4,創建Thread類的子類對象mt.start(); //5,開啟線程for (int i = 0; i <= 1000; i++) {System.out.println("yyy");}}}class MyThread extends Thread { //1,繼承Threadpublic void run() { //2,重寫run方法for (int i = 0;i <= 1000; i++) { //3,將要執行的代碼寫在run方法中System.out.println("xxxxxxxxxxx");}} }
多線程程序實現的方式2
- 實現Runnable接口
- 定義實現Runnable接口的類;
- 實現run方法;
- 把新線程要做的事寫在run方法中;
- 創建自定義的Runnable的子類對象;
- 創建Thread對象,將剛剛創建的Runnable子類對象傳入Runnable;
- 調用start()開啟新線程,Runnable的run()方法被自動調用。
- 舉個例子
以上兩種實現方式的區別
在源碼上的區別:
- 繼承Thread : 由于子類重寫了Thread類的run(), 當調用start()時,直接找子類的run()方法;
- 實現Runnable : 構造函數中傳入了Runnable的引用, 成員變量記住了它, start()調用run()方法時,內部判斷成員變量Runnable的引用是否為空,若不為空,編譯時看的是Runnable的run(),運行時執行的是子類的run()方法。
繼承Thread:
- 好處:可以直接使用Thread類中的方法,代碼簡單;
- 弊端:如果某類已經有了父類,就不能再繼承Thread類了。
實現Runnable接口:
- 好處:即使自己定義的線程類有了父類也沒關系,因為接口是可以多實現的;
- 弊端:不能直接使用Thread中的方法,需要先獲取到線程對象后才能得到Thread的方法,代碼復雜。
獲取和設置線程名字
獲取名字:通過getName()方法獲取線程對象的名字
設置名字:通過構造函數可以傳入String類型的名字
- 舉個例子
獲取線程名字:
package com.guiyang.restudy3;public class D4ThreadName {public static void main(String[] args) {new Thread("安徽財經大學") { //通過構造方法給name賦值public void run() {System.out.println(this.getName() + "...xxx");}}.start();new Thread("安徽醫科大學") {public void run() {System.out.println(this.getName() + "....yyyyyyyy");}}.start();}}控制臺輸出:
安徽財經大學...xxx 安徽醫科大學....yyyyyyyy設置線程名字:
package com.guiyang.restudy3;public class D4ThreadName {public static void main(String[] args) {Thread t1 = new Thread() {public void run() {System.out.println(this.getName() + "...yyyyyyyyy");}};Thread t2 = new Thread() {public void run() {System.out.println(this.getName() + "...xxx");}};t1.setName("財經大學");t2.setName("醫科大學");t1.start();t2.start();}}控制臺輸出:
財經大學...yyyyyyyyy 醫科大學...xxx獲取當前線程對象
獲取當前線程對象:
package com.guiyang.restudy3;public class D5GetThreadObject {public static void main(String[] args) {new Thread(new Runnable() {public void run() {for(int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + "...bb");}}}).start();Thread.currentThread().setName("我是主線程"); //獲取主函數線程的引用,并改名字System.out.println(Thread.currentThread().getName()); //獲取主函數線程的引用,并獲取名字}}控制臺輸出:
我是主線程 Thread-0...bb Thread-0...bb Thread-0...bb Thread-0...bb Thread-0...bb休眠線程
休眠線程:
package com.guiyang.restudy3;public class D5GetThreadObject {public static void main(String[] args) {new Thread() {public void run() {for(int i = 0; i < 5; i++) {System.out.println(getName() + "...yyyyyyyyyyy");try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();new Thread() {public void run() {for(int i = 0; i < 5; i++) {System.out.println(getName() + "...xxx");try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}}控制臺輸出:
Thread-0...yyyyyyyyyyy Thread-1...xxx Thread-0...yyyyyyyyyyy Thread-1...xxx Thread-0...yyyyyyyyyyy Thread-1...xxx Thread-0...yyyyyyyyyyy Thread-1...xxx Thread-0...yyyyyyyyyyy Thread-1...xxx守護線程
設置矩陣論線程和數值分析為守護線程,當非守護線程執行完畢后,守護線程則都自動退出:
package com.guiyang.restudy3;public class D5GetThreadObject {public static void main(String[] args) {Thread t1 = new Thread("數理統計") {public void run() {for(int i = 0; i < 3; i++) {System.out.println(getName() + "...xxx");try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}};Thread t2 = new Thread("數值分析") {public void run() {for(int i = 0; i < 15; i++) {System.out.println(getName() + "...xxx");try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}};Thread t3 = new Thread("矩陣論") {public void run() {for(int i = 0; i < 15; i++) {System.out.println(getName() + "...yyyyyyyy");try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}};t2.setDaemon(true); //將t2和t3設置為守護線程t3.setDaemon(true);t1.start();t2.start();t3.start();}}控制臺輸出:
數值分析...xxx 矩陣論...yyyyyyyy 數理統計...xxx 數值分析...xxx 數理統計...xxx 矩陣論...yyyyyyyy 矩陣論...yyyyyyyy 數理統計...xxx 數值分析...xxx 矩陣論...yyyyyyyy 數值分析...xxx加入線程
設置當前線程暫停,等待指定的線程執行結束后,當前線程再繼續:
package com.guiyang.restudy3;public class D5GetThreadObject {public static void main(String[] args) {final Thread t1 = new Thread() {public void run() {for(int i = 0; i < 6; i++) {System.out.println(getName() + "...yyyyyyyy");try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}};Thread t2 = new Thread() {public void run() {for(int i = 0; i < 6; i++) {if(i == 2) {try {t1.join(); //加入Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(getName() + "...xxx");}}};t1.start();t2.start();}}控制臺輸出:
Thread-1...xxx Thread-1...xxx Thread-0...yyyyyyyy Thread-0...yyyyyyyy Thread-0...yyyyyyyy Thread-0...yyyyyyyy Thread-0...yyyyyyyy Thread-0...yyyyyyyy Thread-1...xxx Thread-1...xxx Thread-1...xxx Thread-1...xxx設置加入線程時間,在指定時間內插隊完成后,兩個線程繼續交替執行:
package com.guiyang.restudy3;public class D5GetThreadObject {public static void main(String[] args) {final Thread t1 = new Thread() {public void run() {for(int i = 0; i < 7; i++) {System.out.println(getName() + "...yyyyyyyy");try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}};Thread t2 = new Thread() {public void run() {for(int i = 0; i < 6; i++) {if(i == 2) {try {t1.join(30); //插隊30毫秒Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(getName() + "...xxx");}}};t1.start();t2.start();}}控制臺輸出:
Thread-0...yyyyyyyy Thread-1...xxx Thread-1...xxx Thread-0...yyyyyyyy Thread-0...yyyyyyyy Thread-0...yyyyyyyy Thread-0...yyyyyyyy Thread-1...xxx Thread-1...xxx Thread-1...xxx Thread-1...xxx Thread-0...yyyyyyyy Thread-0...yyyyyyyy禮讓線程(略)
使用yield讓出cpu:
package com.guiyang.restudy3;public class D5GetThreadObject {public static void main(String[] args) {new MyThread2().start();new MyThread2().start();}}class MyThread2 extends Thread {public void run() {for(int i = 1; i <= 100; i++) {if(i % 10 == 0) {Thread.yield(); //讓出CPU}System.out.println(getName() + "..." + i);}} }總結
以上是生活随笔為你收集整理的第三次学JAVA再学不好就吃翔(part115)--多线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 功能⑦ 小程序整合高德地图定位
- 下一篇: 浅谈js原型和原型链接_js原型链阮一峰