文章目錄
- 前言
- 一、執行緒的創建概述
- 二、Thread創建執行緒
- 1.創建步驟
- 2.代碼實作
- 三、Runnable創建執行緒
- 1.創建步驟
- 2.代碼實作
- 四、Callable創建執行緒
- 1.Callable創建執行緒的優勢
- 2.代碼實作
- 總結
前言
記得好幾年前無VIP下載視頻的時候感覺有點慢,后來推出了花錢開了個VIP,不光能看很多專享電影,這下載速度也是哐哐的上去了,當時覺得這VIP開得值,現在學了多執行緒,以及了解了seek,感覺VIP沒有那么高 大 上了,就是沒VIP的時候,一個作業一個人做,有了VIP之后一個作業多人作業,這效率就提高了非常之多,話不多說,進入今天的主題多執行緒的建立方法簡紹,
一、執行緒的創建概述
Runnable 介面用于定義執行緒的執行體,Runnable 介面僅僅有一個run方法,Thread實作了Runnable介面,但是它的run方法沒有實作任何東西,需要在Thead子類中實作執行緒執行體,
在Java中創建執行緒的常用方式如下:
1,繼承Thread并重寫run()
2、實作Runnable介面
3、實作Callable介面
二、Thread創建執行緒
1.創建步驟
1、定義子類繼承自Thread并重寫run方法
2、創建子類實體
3、start方法啟動執行緒
2.代碼實作
代碼如下(第一個執行緒):
public class MyThread1 extends Thread{
@Override
public void run() { // 重寫Thread的run方法
String name1 = Thread.currentThread().getName();// 使用Thread.currentThread()自帶的getName()
for(int i = 0;i<50;i++) { //建立一個測驗用的for回圈
System.out.println(name1+"列印"+i); // 輸出
}
}
}
代碼如下(第二個執行緒):
public class MyThread2 extends Thread{
@Override
public void run() {
String name2 = Thread.currentThread().getName();
for(int j = 0;j<50;j++) {
System.out.println(name2+"列印"+j);
}
}
}
代碼如下(測驗):
public class Demo02 {
public static void main(String[] args) {
MyThread1 thread01 = new MyThread1();// 創建一個MyThread1()物件
thread01.start();// 啟動執行緒1
MyThread2 thread02 = new MyThread2();// 創建一個MyThread2()物件
thread02.start();// 啟動執行緒2
}
}
代碼如下(輸出):
Thread-0列印0
Thread-0列印1
Thread-0列印2
Thread-0列印3
Thread-0列印4
Thread-0列印5
Thread-0列印6
Thread-0列印7
Thread-0列印8
Thread-0列印9
Thread-0列印10
Thread-0列印11
Thread-0列印12
Thread-0列印13
Thread-0列印14
Thread-0列印15
Thread-0列印16
Thread-0列印17
Thread-0列印18
Thread-0列印19
Thread-0列印20
Thread-0列印21
Thread-0列印22
Thread-0列印23
Thread-0列印24
Thread-0列印25
Thread-0列印26
Thread-0列印27
Thread-0列印28
Thread-0列印29
Thread-0列印30
Thread-0列印31
Thread-1列印0
Thread-0列印32
Thread-1列印1
Thread-0列印33
Thread-1列印2
Thread-0列印34
Thread-1列印3
Thread-1列印4
Thread-1列印5
Thread-1列印6
Thread-1列印7
Thread-1列印8
Thread-1列印9
Thread-1列印10
Thread-1列印11
Thread-1列印12
Thread-1列印13
Thread-1列印14
Thread-1列印15
Thread-1列印16
Thread-1列印17
Thread-1列印18
Thread-1列印19
Thread-1列印20
Thread-1列印21
Thread-1列印22
Thread-1列印23
Thread-1列印24
Thread-1列印25
Thread-1列印26
Thread-1列印27
Thread-1列印28
Thread-1列印29
Thread-1列印30
Thread-1列印31
Thread-1列印32
Thread-1列印33
Thread-1列印34
Thread-1列印35
Thread-1列印36
Thread-1列印37
Thread-1列印38
Thread-1列印39
Thread-1列印40
Thread-1列印41
Thread-1列印42
Thread-1列印43
Thread-1列印44
Thread-1列印45
Thread-1列印46
Thread-1列印47
Thread-1列印48
Thread-1列印49
Thread-0列印35
Thread-0列印36
Thread-0列印37
Thread-0列印38
Thread-0列印39
Thread-0列印40
Thread-0列印41
Thread-0列印42
Thread-0列印43
Thread-0列印44
Thread-0列印45
Thread-0列印46
Thread-0列印47
Thread-0列印48
Thread-0列印49
三、Runnable創建執行緒
1.創建步驟
1、定義Runnable介面的實作類,并重寫介面的run()方法
2、創建Runnable實作類的物件
3、創建Thread類的物件
4、通過start方法啟動執行緒
2.代碼實作
代碼如下(第一個執行緒):
public class MyRunable1 implements Runnable{
@Override
public void run() {// 實作run()方法
String name1 = Thread.currentThread().getName();// 獲取執行緒名
for(int i = 0;i<50;i++) { //建立一個測驗用的for回圈
System.out.println(name1+"列印"+i); // 輸出
}
}
}
代碼如下(第二個執行緒):
public class MyRunable2 implements Runnable{
@Override
public void run() {// 實作run()方法
String name2 = Thread.currentThread().getName();// 獲取執行緒名
for(int i = 0;i<50;i++) { //建立一個測驗用的for回圈
System.out.println(name2+"列印"+i); // 輸出
}
}
}
代碼如下(測驗):
public class Demo03 {
public static void main(String[] args) {
MyRunable1 myRunable1 = new MyRunable1();// 創建一個MyRunable1物件
Thread thread1 = new Thread(myRunable1); // 創建第一個子執行緒
thread1.start();// 啟動執行緒1
MyRunable2 myRunable2 = new MyRunable2();// 創建一個MyRunable2物件
Thread thread2 = new Thread(myRunable2); // 創建第二個子執行緒
thread2.start();// 啟動執行緒2
}
}
代碼如下(輸出):
Thread-0列印0
Thread-1列印0
Thread-1列印1
Thread-1列印2
Thread-1列印3
Thread-1列印4
Thread-1列印5
Thread-1列印6
Thread-1列印7
Thread-1列印8
Thread-1列印9
Thread-1列印10
Thread-1列印11
Thread-1列印12
Thread-1列印13
Thread-1列印14
Thread-1列印15
Thread-1列印16
Thread-1列印17
Thread-1列印18
Thread-1列印19
Thread-1列印20
Thread-1列印21
Thread-1列印22
Thread-1列印23
Thread-1列印24
Thread-1列印25
Thread-1列印26
Thread-1列印27
Thread-1列印28
Thread-1列印29
Thread-1列印30
Thread-1列印31
Thread-0列印1
Thread-0列印2
Thread-0列印3
Thread-0列印4
Thread-0列印5
Thread-0列印6
Thread-0列印7
Thread-0列印8
Thread-0列印9
Thread-0列印10
Thread-0列印11
Thread-0列印12
Thread-0列印13
Thread-0列印14
Thread-0列印15
Thread-0列印16
Thread-0列印17
Thread-0列印18
Thread-0列印19
Thread-0列印20
Thread-0列印21
Thread-0列印22
Thread-0列印23
Thread-0列印24
Thread-0列印25
Thread-0列印26
Thread-0列印27
Thread-0列印28
Thread-0列印29
Thread-0列印30
Thread-0列印31
Thread-0列印32
Thread-0列印33
Thread-0列印34
Thread-0列印35
Thread-0列印36
Thread-0列印37
Thread-0列印38
Thread-0列印39
Thread-0列印40
Thread-0列印41
Thread-0列印42
Thread-0列印43
Thread-0列印44
Thread-0列印45
Thread-0列印46
Thread-0列印47
Thread-0列印48
Thread-0列印49
Thread-1列印32
Thread-1列印33
Thread-1列印34
Thread-1列印35
Thread-1列印36
Thread-1列印37
Thread-1列印38
Thread-1列印39
Thread-1列印40
Thread-1列印41
Thread-1列印42
Thread-1列印43
Thread-1列印44
Thread-1列印45
Thread-1列印46
Thread-1列印47
Thread-1列印48
Thread-1列印49
四、Callable創建執行緒
1.Callable創建執行緒的優勢
通過Thread或者Runnable介面實作多執行緒時需要從寫run()方法,但是此方法沒有回傳值,但是使用Callable這個介面即可創建執行緒還可以獲取回傳值,
2.代碼實作
代碼如下(第一個執行緒):
import java.util.concurrent.Callable;
public class MyCallable implements Callable<Object>{
@Override
public Object call() throws Exception {
String name1 = Thread.currentThread().getName();// 獲取執行緒名
int i = 0;
while(i<40) {// 測驗的while回圈
System.out.println(name1+"列印"+i); // 輸出
i++;
}
return i;
}
}
代碼如下(第二個執行緒):
import java.util.concurrent.Callable;
public class MyCallable2 implements Callable<Object>{
@Override
public Object call() throws Exception {
String name2 = Thread.currentThread().getName();// 獲取執行緒名
int i = 0;
while(i<40) {// 測驗的while回圈
System.out.println(name2+"列印"+i); // 輸出
i++;
}
return i;
}
}
代碼如下(測驗):
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Demo04 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// 創建第一個子執行緒
MyCallable myCallable1 = new MyCallable();
FutureTask<Object> futureTask1 = new FutureTask<>(myCallable1);
Thread thread1 = new Thread(futureTask1);
thread1.start(); // 啟動第一個子執行緒
// 創建第二個子執行緒
MyCallable2 myCallable2 = new MyCallable2();
FutureTask<Object> futureTask2 = new FutureTask<>(myCallable2);
Thread thread2 = new Thread(futureTask2);
thread2.start(); // 啟動第二個子執行緒
System.out.println("-----華麗的分割線-------");
// 獲取第二個子執行緒回傳的結果
Object result = futureTask2.get();
System.out.println("第二個子執行緒回傳的結果為:"+result);
}
}
代碼如下(輸出):
Thread-0列印0
Thread-0列印1
Thread-0列印2
Thread-0列印3
Thread-0列印4
Thread-0列印5
-----華麗的分割線-------
Thread-0列印6
Thread-0列印7
Thread-0列印8
Thread-0列印9
Thread-0列印10
Thread-0列印11
Thread-0列印12
Thread-0列印13
Thread-0列印14
Thread-0列印15
Thread-0列印16
Thread-0列印17
Thread-0列印18
Thread-0列印19
Thread-0列印20
Thread-0列印21
Thread-0列印22
Thread-0列印23
Thread-0列印24
Thread-0列印25
Thread-0列印26
Thread-0列印27
Thread-0列印28
Thread-0列印29
Thread-0列印30
Thread-0列印31
Thread-0列印32
Thread-0列印33
Thread-1列印0
Thread-1列印1
Thread-1列印2
Thread-1列印3
Thread-1列印4
Thread-1列印5
Thread-1列印6
Thread-1列印7
Thread-1列印8
Thread-1列印9
Thread-1列印10
Thread-1列印11
Thread-1列印12
Thread-1列印13
Thread-1列印14
Thread-1列印15
Thread-1列印16
Thread-1列印17
Thread-1列印18
Thread-1列印19
Thread-1列印20
Thread-1列印21
Thread-1列印22
Thread-1列印23
Thread-1列印24
Thread-1列印25
Thread-1列印26
Thread-1列印27
Thread-1列印28
Thread-1列印29
Thread-1列印30
Thread-1列印31
Thread-1列印32
Thread-1列印33
Thread-1列印34
Thread-1列印35
Thread-1列印36
Thread-1列印37
Thread-1列印38
Thread-1列印39
Thread-0列印34
Thread-0列印35
Thread-0列印36
Thread-0列印37
Thread-0列印38
Thread-0列印39
第二個子執行緒回傳的結果為:40
總結
1、Thread類的run()方法是一個空方法體,需要在子類中重寫run()方法實作處理邏輯
2、直接呼叫執行緒物件的run()方法,jvm虛擬機不會將其識別為一個新的執行緒來運行,jvm虛擬機會將其識別成一個普通的方法來呼叫
3、執行緒的啟動是start()而不是run()
4、在子類執行緒內部可通過Thread.currentThread().getName()來獲取執行緒名
5、可以在測驗的時候通過執行緒物件的getName()方法獲取執行緒名
6、在同一個行程中,不同執行緒隨機執行,即執行緒的執行具有隨機性(比如上面的三個創建執行緒的方法測驗的不管是for回圈還是while回圈,回圈范圍都弄得比較大,就是為了直觀體現這一點,這個隨機性在執行緒的學習中一直伴隨我們,所以輸出篇幅比較大也是這個原因,讓大家比較直觀的觀察出來)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263437.html
標籤:java
