多線程之間共享數據的實現

1:
如果每個線程執行的代碼相同,可以使用同一個Runnable對象,然后將共享的數據放在Runnable里面,來實現數據的共享。 例如買票系統...

package com.cn.gbx;import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;public class TestThread {public static void main(String[] args) {//共享數據放在了Count里面Count count = new Count();new Thread(count).start();new Thread(count).start();}
}class Count implements Runnable{private int count = 10;//加互斥鎖,來時實現同步private synchronized void decrement() {count--;System.out.println(Thread.currentThread().getName() + " : " + count);}@Overridepublic void run() {while (true) {decrement();}}
}

  

2: 如果每個線程執行的代碼不同, 那么就需要不同的Runnable對象,有兩種方式事項這些Runnbale對象之間的數據共享
  a: 將共享數據封裝在另一個對象中,然后實現不同的操作,然后將這個新對象傳遞給Runnable對象,每個線程對共享數據的操作也就相應的分配到了那個對象身上去完成。這樣就能夠實現對該數據的各種操作的互斥與通信

package com.cn.gbx;import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;public class TestThread {public static void main(String[] args) {ShareData count = new ShareData();new Thread(new CountDec(count)).start();new Thread(new CountInc(count)).start();}
}//將共享數據封裝在另一個對象里面
class ShareData {private int count = 100;public synchronized void decrement() {count--;System.out.println(Thread.currentThread().getName() + " :" + count);}public synchronized void increment() {count++;System.out.println(Thread.currentThread().getName() + " :" + count);		}
}//然后將新對象放入Runnable對象
class CountDec implements Runnable {private ShareData data = null;public CountDec(ShareData data) {this.data = data;}@Overridepublic void run() {while (true) {data.decrement();}}
}
class CountInc implements Runnable {private ShareData data = null;public CountInc(ShareData data) {this.data = data;}@Overridepublic void run() {while (true) {data.increment();}}
}

  

b: 將這些Runnbale對象作為某一個類中的內部類,共享數據作為外部類的成員變量,每個線程對共享數據的操作也就分配給了外部類,以便實現共享數據的各種操作的互斥通信。

package com.cn.gbx;import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;public class TestThread {//將共享數據作為外部類的成員變量final private static ShareData data = new ShareData();public static void main(String[] args) {//Runnbale內部類可以共享new Thread(new Runnable() {@Overridepublic void run() {while (true) {data.decrement();}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {data.increment();}}}).start();}
}//將共享數據封裝在另一個對象里面
class ShareData {private int count = 100;public synchronized void decrement() {count--;System.out.println(Thread.currentThread().getName() + " :" + count);}public synchronized void increment() {count++;System.out.println(Thread.currentThread().getName() + " :" + count);		}
}

  

?

轉載于:https://www.cnblogs.com/E-star/p/3482170.html

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

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

相關文章

AIX的完整形式是什么?

AIX:高級交互式主管 (AIX: Advanced Interactive Executive) AIX is an abbreviation of "Advanced Interactive Executive". AIX是“ Advanced Interactive Executive”的縮寫 。 It is a progression sequence of proprietary UNIX operating systems …

c#生成隨機字符串 用做批量申請賬號時的隨機密碼還是相當不錯的

//隨機字符串生成器的主要功能如下: //1、支持自定義字符串長度 //2、支持自定義是否包含數字 //3、支持自定義是否包含小寫字母 //4、支持自定義是否包含大寫字母 //5、支持自定義是否包含特殊符號 //6、支持自定義字符…

【C++基礎】C++11的noexcept聲明符 與 異常傳播

目錄C noexcept:1、用途2、用法1、noexcept聲明符的用法:2、noexcept運算符的用法異常傳播1、異常傳播的定義2、異常傳播中的規則3、異常傳播的代價C noexcept: 1、用途 C11使用noexcept指明函數是否拋出異常: 若函數不拋異常&a…

使用IndexReader.repen提高搜索速度

1,使用indexreader創建indexsearcher. 2,indexsearcher在使用完了以后不要關閉. 3.使用indexreader.isCurrent()判斷索引是否被indexwriter改動. 4,如果索引被改動,indexsearcher.close()先前那個,然后new indexsearcher(indexreader). 傳string給searcher,searcher會維護一個內…

CSS中的文本格式

CSS文字格式 (CSS text formatting) CSS text properties allow you to style your text in various ways very easily. Such as color, alignment, spacing, direction, etc. CSS文本屬性使您可以輕松地以各種方式設置文本樣式。 例如顏色 , 對齊方式 ,…

【C++基礎】重拋異常與異常的使用場景

重拋異常 異常處理程序可以重新拋出異常。 當它無法處理該異常,或想通知它的調用者發生了一個異常,此時就需要重拋異常: 1、拋出捕獲的異常 try {// statements; } catch (TheException &ex) {// Do something;throw; }2、重新拋出另一…

vi @-function

vi 的功能 vi 是一個越用越強大的東西 功能: 例: 1 在插入模式 cwgadfly CTL-V ESC 看到的似: cwgadfly^[ 2 保存到g緩沖區 ESC :退出插入模式 "gdd :"g 指緩沖去個 dd刪除一行 這樣g緩沖去的內容是 cwgadflayESC 3 test love u 在…

CSS簡寫指南

1.margin 1.1 margin:1px 2px 3px(上 左右 下) 1.2 margin:2px 3px(上下 左右) 1.2 margin:1px 3px 2px 3px(上右下左) 2.padding(同上) 3.border border:1px red solid (border-width border-color border-style) 1 2 3border-width:1px 2px 3px; //最多可用四個值…

【C++基礎】模板基礎與函數模板

目錄初識模板函數模板函數模板實例化顯式實例化隱式實例化初識模板 求兩個int、float、char類型的數據的最大值: C里面要這樣寫: int maxInt(int x, int y); double maxDouble(double x, double y); char maxChar(char x, char y);C使用函數重載&#…

scala 函數中嵌套函數_Scala合成函數

scala 函數中嵌套函數Scala中的合成功能 (Composition function in Scala) Scala composition function is a way in which functions are composed in program i.e. mixing of more than one functions to extract some results. In Scala programming language, there are mu…

js--基礎

js 0為false 非0為true null為false 非null為true js 特有with(對象){}:可以確定對象所使用的范圍。for(變量 in 對象)對變量和和行為進行遍歷html xhtml xml :這些都是標記型文檔。DOM:document object model 文檔對象模型。 dom三層模型: dom1:將…

字符串的處理[C#]

//string Str1 "友情相逢"; //string Str2 "用一生愛你"; //#region char的使用 //char a a; //Console.WriteLine("IsLetter方法判斷a是否為字母:{0}", Char.IsLetter(a)); …

CentOS安全設置

CentOS安全設置 刪除多余的用戶和用戶組,修改口令文件屬性,禁止[CtrlAltDelete]重啟命令,防止別人ping的方法。整理自互聯網。1、刪除多余的用戶和用戶組//刪除多余用戶# vi /etc/passwduserdel admuserdel lpuserdel syncuserdel shutdownus…

【設計模式之美】<Reading Notes>繼承與組合

繼承缺點 繼承是面向對象的四大特性之一,用來表示類之間的 is-a 關系,可以解決代碼復用的問題。雖然繼承有諸多作用,但繼承層次過深、過復雜,也會影響到代碼的可維護性。在這種情況下,我們應該盡量少用,甚至…

scala中何時使用下劃線_在Scala中使用下劃線

scala中何時使用下劃線Underscore (_) character is reserved in Scala and has multiple usages in the programming language. Based on functions that use the underscore have the following usages: 下劃線(_)字符在Scala中保留,并且在編程語言中有多種用法。…

如何利用C#編寫網頁投票器程序 如何使用代理來投票 代理IP來投票

一、前言看個圖,了解下投票的過程。提交投票信息投票頁 ――――――――>投票信息處理頁反饋投票結果(請求頁)<―――――――(響應頁)一般情況下,填寫投票信息,然后點提交按鈕發送到響應頁,這…

【設計模式之美】<Reading Notes>貧血模型與充血模型

小知識 需要了解的一些名詞 1、領域驅動設計(Domain Driven Design,簡稱 DDD) 2、MVC 三層架構 : M 表示 Model,V 表示 View,C 表示 Controller。 它將整個項目分為三層:展示層、邏輯層、數據層…

TAFE的完整形式是什么?

TAFE:拖拉機和農用設備 (TAFE: Tractors and Farm Equipment) TAFE is an abbreviation of Tractors and Farm Equipment Limited. It is an Indian tractor manufacturer which is founded at Chennai in 1960. It is the second-largest tractor manufacturer in …

Oracle 10g 數據庫的備份和還原

一、備份數據庫1.在圖形工具中,如sqldeveloper,pl/sqldeveloper用以下這句查找空表select alter table ||table_name|| allocate extent; from user_tables where num_rows0;2.把第一步執行得到的結果當用sql語來再次執行3.到oracle服務器上執行備份語句. 運行-cmd …

用戶行為分析指導電商精細化運營

規模和利潤,這兩個在商業運營中最基本的指標,卻在電子商務市場中遭遇了不同的待遇。前兩年,幾乎所有的電商企業都只追求規模,不追求利潤,導 致自身的運營極其粗放,絕大多數電商公司只有兩招:猛打…