Java多線程基礎篇(02)-多線程的實現

1.概要

JAVA多線程實現方式主要有三種:繼承Thread類、實現Runnable接口、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完後都沒有返回值,只有最後一種是帶返回值的。本節,咱們將探討經常使用的實現多線程的2種方式:Thread和Runnable。至於第三種ExecutorService、Callable、Future的實現是屬於java.util.concurrent包下的內容,我將單獨設置一節去探討。java

2.Runnable簡介

2.1 Runnable概述

    Runnable是一個接口,該接口只包含了一個run無參方法。設計該接口的目的是爲但願在活動時執行代碼的對象提供一個公共協議。例如,Thread類實現了Runnable。激活的意思是說某個線程已經啓動而且還沒有中止。多線程

    此外Runnable爲非Thread子類的類提供了一種激活方式。經過實例化某個Thread實例並將自身做爲運行目標,就能夠運行實現Runnable的類而無須建立Thread的子類。大多數狀況下,若是隻想重寫run()方法,而不重寫其餘Thread方法,那麼應使用Runnable接口。這很重要,由於除非程序猿打算修改或加強類的基本行爲,不然不該該建立子類。併發

2.2 Runnable源碼

package java.lang;

public interface Runnable {
    public abstract void run();
}

3.Thread簡介

3.1 Thread概述

    Thread是程序中的執行線程。Java虛擬機容許程序併發地運行多個執行線程。ide

    Thread是一個類。它實現了Runnable接口。學習

3.2 Thread類聲明

public class Thread implements Runnable {}

4.Thread和Runnable的區別

在程序開發中只要是多線程確定永遠以實現Runnable接口爲主,this

首先闡述實現Runnable的好處:spa

  • Java不容許多繼承,所以實現了Runnable接口的類能夠再繼承其餘類
  • 方便資源貢獻,便可以共享一個對象實例。

其次,Thread實現多線程方式是:多個線程完成本身的任務。而Runnable實現多線程的方式是:多個線程共同完成一個任務。這是由於Thread(線程)已是程序中的執行線程了。線程

5.Thread和Runnable的多線程示例

該示例也能看出Thread和Runnable實現多線程的區別設計

5.1Thread的多線程示例

package org.multithread.basic.realize;

public class TestThread {
	public static void main(String[] args) {
		MyThread t1 = new TestThread().new MyThread();
		MyThread t2 = new TestThread().new MyThread();
		MyThread t3 = new TestThread().new MyThread();
		t1.start();
		t2.start();
		t3.start();
	}
	class MyThread extends Thread{
		private int ticket =10;
		@Override
		public void run() {
			for(int i = 0;i<5;i++){
				if(this.ticket > 0){
					System.out.println(this.getName()+"出售:ticket"+this.ticket--);
				}
			}
		}
	};
}

運行結果:code

Thread-0出售:ticket10
Thread-2出售:ticket10
Thread-1出售:ticket10
Thread-2出售:ticket9
Thread-0出售:ticket9
Thread-0出售:ticket8
Thread-0出售:ticket7
Thread-0出售:ticket6
Thread-2出售:ticket8
Thread-1出售:ticket9
Thread-1出售:ticket8
Thread-1出售:ticket7
Thread-1出售:ticket6
Thread-2出售:ticket7
Thread-2出售:ticket6

結果說明:

  • MyThread繼承於Thread,它是自定義線程,每一個MyThread都會出售5張ticket。
  • 線程執行時亂序

5.2 Runnable的多線程示例

對上個程序進行改造,以下:

package org.multithread.basic.realize;

public class TestThread {
	public static void main(String[] args) {
//		MyThread t1 = new TestThread().new MyThread();
//		MyThread t2 = new TestThread().new MyThread();
//		MyThread t3 = new TestThread().new MyThread();
		MyRunnable mr = new TestThread().new MyRunnable();
		Thread t1 = new Thread(mr);
		Thread t2 = new Thread(mr);
		Thread t3 = new Thread(mr);
		t1.start();
		t2.start();
		t3.start();
	}
	class MyThread extends Thread{
		private int ticket =10;
		@Override
		public void run() {
			for(int i = 0;i<5;i++){
				if(this.ticket > 0){
					System.out.println(this.getName()+"出售:ticket"+this.ticket--);
				}
			}
		}
	};
	class MyRunnable implements Runnable{
		private int ticket = 10;

		@Override
		public void run() {
			// TODO Auto-generated method stub
			for(int i = 0;i<5;i++){
				if(this.ticket > 0){
					System.out.println(Thread.currentThread().getName()+"出售:ticket"+this.ticket--);
				}
			}
		}
		
	};
}

運行結果:

Thread-1出售:ticket10
Thread-1出售:ticket7
Thread-1出售:ticket6
Thread-2出售:ticket8
Thread-2出售:ticket4
Thread-2出售:ticket3
Thread-2出售:ticket2
Thread-2出售:ticket1
Thread-0出售:ticket9
Thread-1出售:ticket5

結果說明:

  • 主線程建立並啓動了3個子線程,並且這3個子線程都是基於mr這個Runnable對象建立。
  • 這3個子線程一共賣出了10張ticket。這說明3個子線程資源共享

6 總結

    經過以上學習,咱們瞭解到實現多線程的兩種方式:繼承Thread和實現Runnable接口,可是記住一條:在多線程開發中,要以實現Runnable接口爲主,這是由於Java是單根繼承,能夠多個實現,繼承Thread的類不能再繼承其餘類。而且Thread是執行線程,每一個子線程之間相互獨立,資源不共享。

相關文章
相關標籤/搜索