1. 程式人生 > >【多執行緒】建立執行緒的兩種方式以及其區別

【多執行緒】建立執行緒的兩種方式以及其區別

第一種方式: 通過實現Runnable介面建立執行緒

package cn.qblank.thread;
/**
 * 多執行緒案例1
 * @author Administrator
 *
 */
public class ThreadTest1 implements Runnable{
	private Thread t;
	//執行緒名
	private String threadName; 
	public ThreadTest1(String threadName){
		this.threadName = threadName;
	}
	@Override
	public void run() {
		try {
			for (int i = 0; i < 4; i++) {
				System.out.println(threadName + "拿到" + i);
				Thread.sleep((int) (Math.random()*10));
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		Thread t1 = new Thread(new ThreadTest1("張三"));
		Thread t2 = new Thread(new ThreadTest1("李四"));
		t1.start();
		t2.start();
	}
	
}

執行結果如下:


start()方法呼叫後,並不是立刻執行多執行緒,而是使多執行緒進入可執行狀態,什麼時候執行取決於對cpu的執行權的爭奪。

Thread.sleep()方法呼叫目的是不讓當前執行緒獨自霸佔該程序所獲取的CPU資源,以留出一定時間給其他執行緒執行的機會。

第二種建立方式: 通過繼承Thread類來建立

package cn.qblank.thread;

public class ThreadTest2 extends Thread{
	//執行緒名
	private String threadName;
	public ThreadTest2(String threadName){
		this.threadName = threadName;
	}
	
	@Override
	public void run() {
		for (int i = 0; i < 4; i++) {
			System.out.println( threadName + "拿到:" + i);
			try {
				Thread.sleep((int)Math.random()*10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	//測試
	public static void main(String[] args) {
		ThreadTest2 tt1 = new ThreadTest2("張三");
		ThreadTest2 tt2 = new ThreadTest2("李四");
		tt1.start();
		tt2.start();
	}
}

執行結果如下:


通過實現Runnable介面,使得該類有了多執行緒類的特徵。run()方法是多執行緒程式的一個約定。所有的多執行緒程式碼都在run方法裡面。Thread類實際上也是實現了Runnable介面的類。

實際上Thread類也是實現了Runnable介面


在啟動的多執行緒的時候,需要先通過Thread類的構造方法Thread(Runnable target) 構造出物件,然後呼叫Thread物件的start()方法來執行多執行緒程式碼。實際上所有的多執行緒程式碼都是通過執行Thread的start()方法來執行的。因此,不管是擴充套件Thread類還是實現Runnable介面來實現多執行緒,最終還是通過Thread的物件的API來控制執行緒的

兩者之間的區別:

如果一個類繼承Thread,則不適合資源共享。但是如果實現了Runable介面的話,則很容易的實現資源共享。

實現Runnable介面比繼承Thread類的優勢:

1.適合多個相同程式碼的執行緒去處理同一個資源。

2.可以避免java中單繼承的限制。

3.增加程式碼的健壯性,程式碼可以被多個執行緒共享,程式碼和資料獨立。

4.執行緒池中只能放入實現Runnable或Callable類執行緒,不能放入繼承Thread的類

main方法也是一個執行緒,在java中所有執行緒都是同時啟動的,至於什麼時候哪個先執行,得看看誰先拿到cpu的資源

相關推薦

執行建立執行方式及其區別

第一種方式: 通過實現Runnable介面建立執行緒package cn.qblank.thread; /** * 多執行緒案例1 * @author Administrator * */ public class ThreadTest1 implements Run

併發那些事 建立執行的三方式

建立執行緒可以說是併發知識中最基礎的操作了,JDK 提供的建立執行緒的方式,如果不包括通過執行緒池的話,目前有三種形式,它們分別是通過繼承 Thread 類,通過實現 Runable 介面,通過 FutureTask。如下圖所示 下面整理了一下 3 種方法的具體使用與異同。 建立執行緒的 3 種方法

執行實現內部類的方式

public static void main(String[] args) {// TODO Auto-generated method stub//第一種,繼承Thread類,來實現內部類new Thread(){@Overridepublic void run() {

實現執行方式以及方式之間的區別

Java中有兩種實現多執行緒的方式。一是直接繼承Thread類,二是實現Runnable介面。那麼這兩種實現多執行緒的方式在應用上有什麼區別呢?        為了回答這個問題,我們可以通過編寫一段程式碼來進行分析。我們用程式碼來模擬鐵路售票系統,實現通過四個售票點發售某日

Java中實現執行方式之間的區別

 Java提供了執行緒類Thread來建立多執行緒的程式。其實,建立執行緒與建立普通的類的物件的操作是一樣的,而執行緒就是Thread類或其子類的例項物件。每個Thread物件描述了一個單獨的執行緒。要產生一個執行緒,有兩種方法:     ◆需要從Java.la

9.10 路由控制之反向解析--別名html和views方式實現

com 反向 技術分享 http mage login gin bsp 分享圖片 1. 在html裏反向解析 給路徑起別名,修改路徑時,不用每個地方都修改。 {% url ‘Log‘ %} : 就會去找別名為Log的URL,找到 "login/"後把"logi

springboot項目啟動成功後執行一段代碼的方式

參數 註解 etime mman pac cycle net org 啟動 springboot項目啟動成功後執行一段代碼的兩種方式 實現ApplicationRunner接口 package com.lnjecit.lifecycle; import

第七篇Qt學習與使用---TreeView目錄及其點選事件

1、目的     想要寫一個目錄,可以列出某一路徑下所有的 檔案,並且可以點選開啟。(初始是想做一個閱讀器程式 ) 2、思路 (1)首先需要將檔名稱以目錄的 形式列出。 (2)可以開啟不同型別的檔案,如  資料夾,PDF,doc,csv,&nb

SSM檔案下載的方式

檔案下載的兩種方式 第一種:檔名和大小都是固定的 第二種:檔案有很多,檔名不固定 今天專案中用到了一個檔案下載的方式,將一個app放在伺服器上,可以直接下載,剛開始想到了使用輸出檔案流的方式,思路有了,就直接上手寫了,參考網上的資料,整理出來了一

獲取Executor提交的併發執行的任務返回結果的方式/ExecutorCompletionService使用

當我們通過Executor提交一組併發執行的任務,並且希望在每一個任務完成後能立即得到結果,有兩種方式可以採取: 方式一: 通過一個list來儲存一組future,然後在迴圈中輪訓這組future,直到每個future都已完成。如果我們不希望出現因為排在前面的任務阻

SQLite資料庫小結sql語句的形式以及你不能不知的事務

android中對sql語句進行了兩種封裝。本質上都是封裝了sql語句,都需要通過SQLiteDtabase類使用其例項方法. NO.1 insert方法: 向資料庫新增一條記錄 dele

python並發編程:線程-開啟線程的方式

utf-8 data NPU pre int thread pro reading class 一 threading模塊介紹 multiprocess模塊完全模仿了threading模塊的接口,二者在使用層面,有很大的相似性 二 開啟線程的兩種方式 方式一 f

建立資源的方式

命令 vs 配置檔案 Kubernetes 支援兩種方式建立資源: 1. 用 kubectl 命令直接建立 kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2   在命令列中通過引數指定資源的屬性。 2.

spark建立DF的方式

方式一:反射:(使用這種方式來建立DF是在你知道欄位具體有哪些) 1.建立一個SparkContext,然後再建立SQLContext 2.先建立RDD,對資料進行整理,然後關聯case class,將非結構化的資料轉換成結構化資料 3.顯示的呼叫toDF方法,將RDD轉換成DF(需要隱私轉

Java Spark之建立RDD的方式和操作RDD

首先看看思維導圖,我的spark是1.6.1版本,jdk是1.7版本  spark是什麼?  Spark是基於記憶體計算的大資料平行計算框架。Spark基於記憶體計算,提高了在大資料環境下資料處理的實時性,同時保證了高容錯性和高可伸縮性,允許使用者將Spark 部署在大量廉

建立String的方式有什麼不同

1.String a=new String("abc");    String b=new String("abc"); 當使用String a=new String("abc");時,雖然值是一樣的,但每次建立一個新的物件,每個物件的地址不同。 2.String b="a

程序的建立建立程序的方式

一:程序的建立      1,系統的初始化       2,一個程序在執行過程中開啟了子程序       3,使用者的互動式請求,而建立一個新程序(如雙擊qq)       4,一個批處理作業的初始化(只在大型機的批處理系統中應用)        關於程序的建立,UNIX和W

JAVA 建立程序的方式

在Java中建立執行緒有兩種方式:繼承Thread類或者實現Runnable介面再重寫run()方法 那麼在Java中要如何建立程序呢? 同樣也有兩種方法 通過ProcessBuilder.start()方法 先看程序類Process publ

DOS下建立連線的方式

    在DOS中,有著兩種建立連結的方法:快捷方式和連結。    一、快捷方式    快捷方式應該是使用得比較多的了,它其實是一個字尾名為.lnk的檔案,其在BAT指令碼中建立的方式是通過VB來進行建立,具體程式碼如下::CreateShortmshta VBScript:

Hibernate學習筆記(一)之——根據配置檔案自動建立表的方式(註解方式和配置檔案方式

環境準備:jdk  eclipse   hibernate、mysql jar包 專案截圖: Student是根據配置檔案建立表,Teacher是根據註解建立表 Student.java package com.java1234.model; publi