Java中Runnable和Thread的區別

概述

Runnable 是接口。

Thread 是類,且實現了Runnable接口。

Thread部分源碼

public class Threadimplements Runnable
{private static class Caches{static final ConcurrentMap subclassAudits = new ConcurrentHashMap();static final ReferenceQueue subclassAuditsQueue = new ReferenceQueue();

在使用Runnable定義的子類中沒有start()方法,只有Thread類中才有。

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

Thread類,有一個構造方法:public Thread(Runnable targer)

    public Thread(Runnable runnable){daemon = false;stillborn = false;threadLocals = null;inheritableThreadLocals = null;threadStatus = 0;blockerLock = new Object();init(null, runnable, (new StringBuilder()).append("Thread-").append(nextThreadNum()).toString(), 0L);}

此構造方法接受Runnable的子類實例,也就是說可以通過Thread類來啟動Runnable實現的多線程。


使用情況

在程序開發中只要是多線程肯定永遠以實現Runnable接口為主。

實現Runnable接口相比繼承Thread類有如下好處:
1、避免繼承的局限,一個類可以繼承多個接口。
2、適合于資源的共享。


實例

以賣票為例,總共只有10張動車票了,全國3個窗口在賣。


繼承Thread類的方法

package multithreading;public class MyThreadWithExtends extends Thread {private int tickets = 10;@Overridepublic void run() {for (int i = 0; i <= 100; i++) {if(tickets>0){System.out.println(Thread.currentThread().getName()+"--賣出票:" + tickets--);}}}public static void main(String[] args) {MyThreadWithExtends thread1 = new MyThreadWithExtends();MyThreadWithExtends thread2 = new MyThreadWithExtends();MyThreadWithExtends thread3 = new MyThreadWithExtends();thread1.start();thread2.start();thread3.start();//每個線程都獨立,不共享資源,每個線程都賣出了10張票,總共賣出了30張。如果真賣票,就有問題了。}}

運行結果:

Thread-0--賣出票:10
Thread-2--賣出票:10
Thread-1--賣出票:10
Thread-2--賣出票:9
Thread-0--賣出票:9
Thread-2--賣出票:8
Thread-1--賣出票:9
Thread-2--賣出票:7
Thread-0--賣出票:8
Thread-2--賣出票:6
Thread-2--賣出票:5
Thread-2--賣出票:4
Thread-1--賣出票:8
Thread-2--賣出票:3
Thread-0--賣出票:7
Thread-2--賣出票:2
Thread-2--賣出票:1
Thread-1--賣出票:7
Thread-0--賣出票:6
Thread-1--賣出票:6
Thread-0--賣出票:5
Thread-0--賣出票:4
Thread-1--賣出票:5
Thread-0--賣出票:3
Thread-1--賣出票:4
Thread-1--賣出票:3
Thread-1--賣出票:2
Thread-0--賣出票:2
Thread-1--賣出票:1
Thread-0--賣出票:1

每個線程都獨立,不共享資源,每個線程都賣出了10張票,總共賣出了30張。如果真賣票,就有問題了。


實現Runnable接口方式

package multithreading;public class MyThreadWithImplements implements Runnable {private int tickets = 10;@Overridepublic void run() {for (int i = 0; i <= 100; i++) {if(tickets>0){System.out.println(Thread.currentThread().getName()+"--賣出票:" + tickets--);}}}public static void main(String[] args) {MyThreadWithImplements myRunnable = new MyThreadWithImplements();Thread thread1 = new Thread(myRunnable, "窗口一");Thread thread2 = new Thread(myRunnable, "窗口二");Thread thread3 = new Thread(myRunnable, "窗口三");thread1.start();thread2.start();thread3.start();}}

運行結果:

窗口二--賣出票:10
窗口三--賣出票:9
窗口一--賣出票:8
窗口三--賣出票:6
窗口三--賣出票:4
窗口三--賣出票:3
窗口三--賣出票:2
窗口三--賣出票:1
窗口二--賣出票:7
窗口一--賣出票:5

每個線程共享了對象myRunnable的資源,賣出的總票數是對的,但是順序是亂的,怎么辦?

見:同步關鍵詞synchronized



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539010.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539010.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 神經網絡工具_神經網絡15分鐘入門!使用python從零開始寫一個兩層神經網絡...

本篇是該系列的第三篇&#xff0c;建議在閱讀本篇文章之前先看前兩篇文章。在本文中將使用python實現之前描述的兩層神經網絡&#xff0c;并完成所提出的“象限分類”的問題。需要注意的是&#xff0c;雖然標題叫做神經網絡15分鐘入門&#xff0c;但是到這篇文章&#xff0c;對…

12.3目錄結構

目錄結構 設計好目錄結構 可讀性高可維護性高比如一個Foo項目Foo/--- bin/--- foo--- foo/--- tests/--- _init__.py--- test_main.py--- init.py--- main.py---doc--- conf.py---abc.rst--- setup.py--- requirement.txt--- README簡要解釋一下&#xff1a; bin/:存放項目的一…

pyecharts添加文字_超燃的文字云效果,用Python就能輕松get!

本文轉載自公眾號&#xff1a;數據森麟(ID&#xff1a;shujusenlin)作者&#xff1a;葉庭云鏈接&#xff1a;https://blog.csdn.net/fyfugoyfa/ 01 / 詞云圖詞云圖是一種用來展現高頻關鍵詞的可視化表達&#xff0c;通過文字、色彩、圖形的搭配&#xff0c;產生有沖擊力地視覺效…

同步關鍵詞synchronized

概述 synchronized是java中的一個關鍵字&#xff0c;也就是說是Java語言內置的特性。 synchronized( 一個任意的對象&#xff08;鎖&#xff09; ){ 代碼塊中放操作共享數據的代碼。 } public synchronized int getIndex() {return 1;}public static synchronized int getN…

python連接mysql用哪個模塊_Python連接MySQL數據庫之pymysql模塊使用

Python3連接MySQL本文介紹Python3連接MySQL的第三方庫--PyMySQL的基本使用。PyMySQL介紹PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務器的一個庫&#xff0c;Python2中則使用mysqldb。Django中也可以使用PyMySQL連接MySQL數據庫。PyMySQL安裝pip install pymysql連接數據…

mysql 創建視圖 主鍵_MySQL數據庫基礎操作命令,本文助你更上一層樓!

今天介紹的是關于Mysql數據庫一些操作的基礎命令用戶與權限創建用戶mysql>create user test identified by BaC321#; 修改密碼5.5版本及以前的命令mysql>set password for testpassowrd(!1A2#3); 5.6及以上命令mysql>update mysql.user set authentication_stringpass…

mysql 聚合函數 怎么用在條件里_MySql 中聚合函數增加條件表達式的方法

Mysql 與聚合函數在一起時候where條件和having條件的過濾時機where 在聚合之前過濾當一個查詢包含了聚合函數及where條件&#xff0c;像這樣的情況select max(cid) from t where t.id<999這時候會先進行過濾&#xff0c;然后再聚合。先過濾出ID《999的記錄&#xff0c;再查找…

drbd(三):drbd的狀態說明

1.幾種獲取狀態信息的方法 drbd有很多獲取信息的方式。在drbd84和之前的版本&#xff0c;大多都使用cat /proc/drbd來獲取信息&#xff0c;多數情況下&#xff0c;這個文件展示的信息對于管理和維護drbd來說已經足夠。 例如以下是drbd84上兩個volume的節點狀態信息&#xff1a;…

Lock的lock()方法

ReentrantLock是JDK唯一實現了Lock接口的類 lock() 是平常使用得最多的一個方法&#xff0c;就是用來獲取鎖。如果鎖已被其他線程獲取&#xff0c;則進行等待。 由于在前面講到如果采用Lock&#xff0c;必須主動去釋放鎖&#xff0c;并且在發生異常時&#xff0c;不會自動釋放鎖…

Lock的tryLock()方法

概述 tryLock()方法是有返回值的&#xff0c;它表示用來嘗試獲取鎖&#xff0c;如果獲取成功&#xff0c;則返回true&#xff0c;如果獲取失敗&#xff08;即鎖已被其他線程獲取&#xff09;&#xff0c;則返回false&#xff0c;這個方法無論如何都會立即返回。在拿不到鎖時不…

python requests庫詳解_python的requests庫詳解

快速上手迫不及待了嗎&#xff1f;本頁內容為如何入門 Requests 提供了很好的指引。其假設你已經安裝了 Requests。如果還沒有&#xff0c;去安裝一節看看吧。首先&#xff0c;確認一下&#xff1a;Requests 已安裝Requests 是最新的讓我們從一些簡單的示例開始吧。發送請求使用…

python QTreeWidgetItem下面有幾個子tree_python-nlp ch1筆記:nlp的基礎應用、高級應用、python優勢、nltk環境搭建...

本帖是對(印度)Jalaj Thanaki作品《python自然語言處理》的翻譯、縮減及改編~nlp的基礎應用NLP是AI的子分支&#xff0c;其相關概念可以用于以下專家系統中&#xff1a;語音識別系統問答系統機器翻譯文本摘要情感分析基于模板的聊天機器人文本分類主題分割nlp的高級應用理解自然…

C#使用ListView更新數據出現閃爍解決辦法

C#使用ListView更新數據出現閃爍解決辦法 在使用vs自動控件ListView控件時候&#xff0c;更新里面的部分代碼時候出現閃爍的情況 如圖&#xff1a; 解決以后&#xff1a; 解決辦法使用雙緩沖&#xff1a;添加新類繼承ListView 對其重寫 1 public class DoubleBufferListView : …

Lock的tryLock(long time, TimeUnit unit)方法

概述 tryLock(long time, TimeUnit unit)方法和tryLock()方法是類似的&#xff0c;只不過區別在于這個方法在拿不到鎖時會等待一定的時間&#xff0c;在時間期限之內如果還拿不到鎖&#xff0c;就返回false。如果一開始拿到鎖或者在等待期間內拿到了鎖&#xff0c;則返回true。…

python語音識別的第三方庫_python標準庫+內置函數+第三方庫: 7.音頻處理

python標準庫內置函數第三方庫 欲善其事&#xff0c;必先利其器 這其器必是python的標準庫內置函數&#xff0c;話說許多第三方庫&#xff0c; 也是對標準庫的使用&#xff0c;進行封裝&#xff0c;使得使用起來更方便。 這些庫以使用場景來分類: 7、音頻處理 音頻處理主要適用…

SperingBoot+vue文件上傳下載預覽

上傳文件&#xff1a; 前端&#xff1a; 整個過程&#xff0c;就是在使用FormData 添加 上File&#xff08;這個Blob&#xff09;&#xff0c;并且key要和后臺的名字對應上在點擊上傳按鈕開始上傳之前&#xff0c;使用了URL.createObjectURL(File)創建blobUrl&#xff0c;給了…

keepalived腦裂問題查找

在自己環境做keepalivedredis實驗時&#xff0c;當重啟了備用redies機器后&#xff0c;發現兩臺redies主機都拿到了VIP [plain] view plaincopy [rootredis2 ~]# ip addr list 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopbac…

python 多線程并行 矩陣乘法_python實現簡單的并行矩陣乘法

python實現簡單的并行矩陣乘法python實現簡單的并行矩陣乘法本文采用的矩陣乘法方式是利用一個矩陣的行和二個矩陣的列相乘時不會互相影響。假設A(m,n)表示矩陣的m行&#xff0c;n列。那么C(m,m)A(m,n) * B(n,m) &#xff1a;計算C矩陣時候分解成&#xff1a;process-1&#xf…

停止Java線程,小心interrupt()方法

轉自http://www.blogjava.NET/jinfeng_wang/archive/2008/04/27/196477.html ---------------------------------------------------------------------------------------------------- 程序是很簡易的。然而&#xff0c;在編程人員面前&#xff0c;多線程呈現出了一組新的難…

python輸入數學表達式并求值_用Python3實現表達式求值

一、題目描述 請用 python3編寫一個計算器的控制臺程序&#xff0c;支持加減乘除、乘方、括號、小數點&#xff0c;運算符優先級為括號>乘方>乘除>加減&#xff0c;同級別運算按照從左向右的順序計算。 二、輸入描述 數字包括"0123456789"&#xff0c;小數點…