1. 程式人生 > >多執行緒學習(一):多執行緒的兩種實現方式

多執行緒學習(一):多執行緒的兩種實現方式

程序和執行緒

程序是受作業系統管理的基本執行單元。
執行緒是在程序中獨立執行的子任務。

多執行緒的優點

使用多執行緒技術後,可以在同一時間內執行更多不同種類的任務。
單執行緒是同步執行任務,多執行緒是非同步執行任務。

多執行緒的使用方式

1:繼承Thread
2:實現Runnable介面

在這裡插入圖片描述
上述兩種實現沒有本質的區別,使用繼承Thread的方式只能單根繼承,而實現Runnable的方式可以實現多繼承。

例一

程式碼

public class MyThread extends Thread{
	@Override
	public void run() {
		super.run();
		System.out.println("子執行緒名:"+Thread.currentThread().getName());
	}

	public static void main(String[] args) {
		new MyThread().start();
		System.out.println("主執行緒名:"+Thread.currentThread().getName());
	}
}

執行結果

在這裡插入圖片描述
上述程式碼列印執行緒名,子執行緒會呼叫run方法,主執行緒列印的名字為“main”,注意這個main不是方法名。在多執行緒時,程式碼的執行結果和程式碼執行順序是無關的。

執行緒的隨機特性

例二

程式碼

public class MyThread02 extends Thread{
	@Override
	public void run() {
		try {
			for(int i=0;i<10;i++){
				int time=(int)Math.random()*1000;
					Thread.sleep(time);
				System.out.println("子執行緒="+Thread.currentThread().getName());
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		new MyThread02().start();
		try {
			for(int i=0;i<10;i++){
				int time=(int)Math.random()*1000;
					Thread.sleep(time);
				System.out.println("主執行緒="+Thread.currentThread().getName());
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

執行結果

在這裡插入圖片描述
上述程式碼使用隨機數使執行緒得到掛起的效果,子執行緒和主執行緒隨機執行,
體現CPU在執行執行緒中的不確定性。

start()

start方法通知“執行緒規劃器”此執行緒已經準備就緒,等待呼叫執行緒物件的run()方法,使執行緒得到執行。注意start()方法會自己呼叫run()方法執行,但如果直接呼叫run()方法,那麼run則只是一個普通方法。
注意:start()方法的順序不代表執行緒啟動的順序。

例三

程式碼

public class MyThread03 extends Thread{
	private int i;
	public MyThread03(int i) {
		this.i=i;
	}
	@Override
	public void run() {
		System.out.println(i);
	}
	public static void main(String[] args) {
		new MyThread03(1).start();
		new MyThread03(2).start();
		new MyThread03(3).start();
		new MyThread03(4).start();
		new MyThread03(5).start();
		new MyThread03(6).start();
		new MyThread03(7).start();
		new MyThread03(8).start();
		new MyThread03(9).start();
		new MyThread03(10).start();
	}
}

執行結果

在這裡插入圖片描述

實現Runnable介面

例四

public class MyRunnable01 implements Runnable{
	@Override
	public void run() {
		System.out.println("子執行緒:"+Thread.currentThread().getName());
	}
	public static void main(String[] args) {
		Thread thread=new Thread(new MyRunnable01());
		thread.start();
	}
}

可以給Thread物件傳入一個實現Runnable介面的方法。
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述