當前位置:首頁 » 網購平台 » 購物平台多線程
擴展閱讀
寧波奧德賽優惠價格 2021-03-15 14:26:02
丹尼斯購物卡能掛失么 2021-03-15 14:25:58
淘寶購物指紋驗證失敗 2021-03-15 14:24:44

購物平台多線程

發布時間: 2021-03-13 12:04:36

❶ 多線程原理有哪些

多線程概述
進程和線程都是操作系統的概念。進程是應用程序的執行實例,每個進程是由私有的虛擬地址空間、代碼、數據和其它各種系統資源組成,進程在運行過程中創建的資源隨著進程的終止而被銷毀,所使用的系統資源在進程終止時被釋放或關閉。
線程是進程內部的一個執行單元。系統創建好進程後,實際上就啟動執行了該進程的主執行線程,主執行線程以函數地址形式,比如說main或WinMain函數,將程序的啟動點提供給Windows系統。主執行線程終止了,進程也就隨之終止。
每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。用戶根據需要在應用程序中創建其它線程,多個線程並發地運行於同一個進程中。每個線程具有自己的堆棧和自己的 CPU 寄存器副本。其他資源(如文件、靜態數據和堆內存)由進程中的所有線程共享。所以線程間的通訊非常方便,多線程技術的應用也較為廣泛。但是使用這些公共資源的線程必須同步。Win32 提供了幾種同步資源的方式,包括信號、臨界區、事件和互斥體。
每個進程都有私有的虛擬地址空間,進程的所有線程共享同一地址空間。每個線程被CPU分配一個時間片,一旦被激活,它正常運行直到時間片耗盡並被掛起,此時,操作系統選擇另一個線程進行運行。通過時間片輪轉,又出於各個時間片很小(20毫秒級),看起來就像多個線程同時在工作。實際上,只有在多處理器系統上才是真正的在可得到的處理器上同時運行多個線程。基於Win32的應用程序可以通過把給定進程分解(或創建)多個線程挖掘潛在的CPU時間,而且還可以加強應用程序,以使用戶提高效率,加強反應能力以及進行後台輔助處理。
在Windows操作系統中,Win32應用程序可以在Windows平台上運行多個實例,每個應用程序實例都是一個獨立的進程,而一個進程可以由不止一個線程來實現。對於一個進程來說,當應用程序有幾個任務要同時運行時,建立多個線程是有用的。如列印時,利用多線程機制實現多線程,就可在需要列印時創建一個負責完成列印功能的列印線程。創建列印線程之後,系統就變成了多線程。當進行列印時,CPU輪換著分配給這兩個線程時間片,所以列印和其他功能一起同時在運行,這就充分利用了CPU處理列印工作之外的空閑時間片,並且避免了用戶長久地等待列印時間。這就是所謂的由多線程來實現的多任務,在進行列印任務的同時又可以進行別的任務。要說明的一點是,目前大多數的計算機都是單處理器(CPU)的,為了運行所有這些線程,操作系統為每個獨立線程安排一些CPU時間,操作系統以輪換方式向線程提供時間片,這就給人一種假象,好象這些線程都在同時運行。由此可見,如果兩個非常活躍的線程為了搶奪對CPU的控制權,在線程切換時會消耗很多的CPU資源,反而會降低系統的性能。這一點在多線程編程時應該注意。
Win32 SDK函數支持進行多線程的程序設計,並提供了操作系統原理中的各種同步、互斥和臨界區等操作。Visual C++ 6.0中,使用MFC類庫也實現了多線程的程序設計,線程被分為工作者線程(Worker Thread)和用戶界面線程(User Interface Thread)兩大類。前者常用於處理後台任務,執行這些後台任務並不會耽擱用戶對應用程序的使用,即用戶操作無需等待後台任務的完成。後者常用來獨立的處理用戶輸入和相應用戶的事件。其中用戶界面線程的特點是擁有單獨的消息隊列,可以具有自己的窗口界面,能夠對用戶輸入和事件做出響應。在應用程序中,根據用戶界面線程具有消息隊列這一特點,可以使之循環等待某一事件發生後再進行處理。由於Windows95時搶先式多任務的操作系統,即使一個線程因等待某事件而阻塞,其他線程仍然可以繼續執行。

❷ java多線程的運行和平台相關嗎,為什麼

和平台無關, java程序可以跨平台運行,多線程的程序也是java程序沒差別。

java如何跨平台參考:http://www.cnblogs.com/028fly/archive/2010/04/04/1704248.html

❸ 多線程調用方法問題

個人認為,你對線程理解有誤,線程就是單一的線程,是執行任務(function)的平台.
Thread1平台上執行任務:func1()->func2()->func3()->......

Thread2平台上執行任務:func1()->func2()->func3()->......
你覺的會有什麼錯?只是他們在執行任務的時候可能會用到一些公共資源,可能會影響你任務的最終預想結果而已。

這樣解釋你明白了嗎?

❹ java語言編寫超市購物系統 運用多個類,多個監聽,最好不要用資料庫,用文件的形式

Java語言的主要特點:1.跨平台性所謂的跨平台性,是指軟體可以不受計算機硬體和操作系統的約束而在任意計算機環境下正常運行。這是軟體發展的趨勢和編程人員追求的目標。之所以這樣說,是因為計算機硬體的種類繁多,操作系統也各不相同,不同的用戶和公司有自己不同的計算機環境偏好,而軟體為了能在這些不同的環境里正常運行,就需要獨立於這些平台。而在Java語言中,Java自帶的虛擬機很好地實現了跨平台性。Java源程序代碼經過編譯後生成二進制的位元組碼是與平台無關的,但是可被Java虛擬機識別的一種機器碼指令。Java虛擬機提供了一個位元組碼到底層硬體平台及操作系統的屏障,使得Java語言具備跨平台性。2.面向對象面向對象是指以對象為基本粒度,其下包含屬性和方法。對象的說明用屬性表達,而通過使用方法來操作這個對象。面向對象技術使得應用程序的開發變得簡單易用,節省代碼。Java是一種面向對象的語言,也繼承了面向對象的諸多好處,如代碼擴展、代碼復用等。3.安全性安全性可以分為四個層面,即語言級安全性、編譯時安全性、運行時安全性、可執行代碼安全性。語言級安全性指Java的數據結構是完整的對象,這些封裝過的數據類型具有安全性。編譯時要進行Java語言和語義的檢查,保證每個變數對應一個相應的值,編譯後生成Java類。運行時Java類需要類載入器載入,並經由位元組碼校驗器校驗之後才可以運行。Java類在網路上使用時,對它的許可權進行了設置,保證了被訪問用戶的安全性。4.多線程多線程在操作系統中已得到了最成功的應用。多線程是指允許一個應用程序同時存在兩個或兩個以上的線程,用於支持事務並發和多任務處理。Java除了內置的多線程技術之外,還定義了一些類、方法等來建立和管理用戶定義的多線程。5.簡單易用Java源代碼的書寫不拘泥於特定的環境,可以用記事本、文本編輯器等編輯軟體來實現,然後將源文件進行編譯,編譯通過後可直接運行,通過調試則可得到想要的結果。

❺ java多線程的運行與平台相關嗎

當然有關
多線程同步的實現方法不是完全通用,最主要的是不同平台下的效果存在差異

❻ 電商平台什麼時候用多線程機制,具體是資料庫連接嗎還有哪些方式解決並發問題

資料庫連接肯定是需要考慮多線程以及並發處理的。其他還有在web訪問的時候多線程和並發的處理,你可以理解為對http請求的並發的處理。

❼ 請問購物車應用中 , 購物車Bean類里的方法為什麼都加同步鎖啊

同步鎖那肯定用了像ArrayList之類的東西...
如果用Vector的話就不用了...
Vector採用隊列式(Queue)存儲方式,ArrayList可以內多線程同步讀取容..
當多線程,如web每一個用戶既一個線程,同時往Vector里存東西的時候,會把請求添加到隊列中,一個一個按順序存儲.
而ArrayList被多個用戶同時存儲時,會一起往裡放.會出現一些不可控制的異常.所以,為了保證只有一個用戶使用ArrayList,所以需要線程同步.

❽ 如何讓 windows 平台多線程 DLL 完整退出

如果你在windows平台開發動態鏈接庫,並且在鏈接庫啟動了內部線程,那麼你很有可能發現載入你的DLL的程序在退出時會死鎖,有時候雖然主程序界面沒有了,但是打開任務管理器,發現進程還在。
最近做播放器插件開發,基於directshow、vlc、mplayer框架,各做了一個插件,三個插件中都使用了另外一個媒體DLL庫(Mylib.dll),並且都是通過動態載入(LoadLibrary)使用的。該DLL比較復雜,內部使用的線程;另外directshow、vlc的插件自身也是一個DLL,mplayer不支持動態插件,是內置源碼編譯。
在沒有針對進程退出做處理時,三個播放器(基於directshow的播放器測試了GraphEidt、Windows Media Player)都不能正常退出。
通過查看線程調用棧,是在Mylib.dll最後卸載時,dll的一個全局對象析構中,等待一個事件(Event)對象不返回,而這個事件應該是另一個線程退出前設置為有信號,但是整個進程除了主線程外,其他線程都已經結束了,這說明線程是被強行結束了,主線程調用棧顯示已經進入了_ExitProcess中,應該是在此之前主線程殺死了所有子線程。
三個播放器框架都沒有找到退出通知的機制,所以能夠想到的辦法只有使用atexit,在程序結束時調用一個Mylib.dll停止介面(Mylib_Stop)。都是沒有效果,仍然不能正常退出。
但是與上面的情形不一樣的是,mplayer還是掛死在Mylib.dll中的全局對象析構中;directshow與vlc卻直接掛死在Mylib_Stop函數中,調用棧顯示正在等待另一個線程退出,但是這個線程卻在_ExitThread的地方卡住了。
要解決全局對象析構中的死鎖問題,需要讓線程正常退出,而不是被強行終止,因此需要在_ExitProcess前面卸載Mylib.dll。我們把這個任務增加到atexit的過程中,因為atexit的函數在退出主函數main後就會被調用,修改之後,mplayer真的可以正常退出了。
對於directshow與vlc,都是在一個插件DLL中啟動Mylib.dll,我們發現atexit注冊的函數,是在插件Dll卸載的時候被調用,調用棧中有DllMain函數。聯想到執行DllMain函數的一些細節,覺得情況應該是這樣:系統在調用DllMain時會有一個全局鎖,主線程已經進入DllMain,所有鎖已經被加上,另一個線程退出時也會調用DllMain,也需要這個鎖,這樣就造成了主線程等待另一個線程退出,而這個線程又在等待主線程佔有的鎖,形成了死鎖情形。
另外在DLL中使用atexit注冊的函數,不像我們期望的那樣在進程退出時調用,而且在相應的DLL卸載時調用,這一點MSDN沒有說明,但是通過跟蹤到atexit裡面,發現確實是根據DLL還是EXE分別處理的,同時也發現EXE中使用的是_imp___onexit函數。
嘗試用_imp___onexit替換atexit,編譯沒有問題,但是運行會crash,因為注冊的退出執行函數的代碼實際是在插件DLL,而這個DLL在進程退出前已經卸載,代碼頁面失效。
最終我們只能修改Mylib.dll,去除全局變數析構中的等待事件死鎖,並且不使用atexit,這樣能夠適應三個播放器;代價是Mylib.dll沒有正常終止,裡面的線程被強行終止,有可能會有一些善後工作無法完成。
總結如下:1、帶有內部線程DLL要想正常退出,需要導出一個退出函數介面,並且要求調用者在適當的時候調用。
2、要注意DLL中全局變數析構前,線程可能已經被強行終止,如果在析構中依賴某個線程完成一些工作,則要考慮這種可能性,但是直接等待線程句柄沒有問題
3、在DLL代碼中使用atexit注冊的函數,不能期望在進程退出時被調用,另外不管是在DLL還是EXE代碼中,不能將其他模塊的函數注冊到atexit中。

❾ java多線程開多少上限量。

「整式為單項式和多項式的統稱,是有理式的一部分,在有理式中可以包含加,減,乘,除、乘方五種運算,但在整式中除數不能含有字母。

❿ 一個進程最多包含多少個線程

1,在x86平台32位系統,系統佔用2GB地址空間,用戶方式2GB。如果使用VS,鏈接程序開關/SACK 或者/F可以設置線程堆棧大小,默認分配一個線程的堆棧大小是1MB,當CreateThread參數的StackSize大小與鏈接程序設置的不一致時,採用的方法是誰大用誰的,所以用4KB修改當然不會有改變!理論上最大線程數=2GB/1MB=2048。
實際上這個用戶方式的2GB並不會全部用作線程堆棧。首先程序的代碼和數據、進程環境塊、線程環境塊、空指針區域等等也需要佔用一定的地址空間;再者2GB只是虛擬內存,如果非分頁內存被用完,就無法再創建線程,這個與特定機器有關,所以不同機器上做最大線程數測試得到的數字可能不一樣。
2,操作系統給一個系統進程提供的空間是2GB ,而一個線程堆棧的空間默認在啟動的時候是1MB 那麼啟動完2000後,基本上就有2GB了,你可以減小默認堆棧的大小。
3,默認情況下,一個線程的棧要預留1M的內存空間而一個進程中可用的內存空間只有2G,所以理論上一個進程中最多可以開2048個線程
但是內存當然不可能完全拿來作線程的棧,所以實際數目要比這個值要小。你也可以通過連接時修改默認棧大小,將其改的比較小,這樣就可以多開一些線程。如將默認棧的大小改成512K,這樣理論上最多就可以開4096個線程。即使物理內存再大,一個進程中可以起的線程總要受到2GB這個內存空間的限制。比方說你的機器裝了64GB物理內存,但每個進程的內存空間還是4GB,其中用戶態可用的還是2GB。如果是同一台機器內的話,能起多少線程也是受內存限制的。每個線程對象都要站用非頁面內存,而非頁面內存也是有限的,當非頁面內存被耗盡時,也就無法創建線程了。
如果物理內存非常大,同一台機器內可以跑的線程數目的限制值會越來越大。

在Windows下寫個程序,一個進程Fork出2000個左右線程就會異常退出了,為什麼?

這個問題的產生是因為windows32位系統,一個進程所能使用的最大虛擬內存為2G,而一個線程的默認線程棧StackSize為1024K(1M),這樣當線程數量逼近2000時,2000*1024K=2G(大約),內存資源就相當於耗盡。

4,默認每線程1MB堆棧的話,只能開2048線程(如果你的其它系統資源足夠的話)。要想開更多線程,只能修改每個線程的堆棧,但實際中是不推薦這樣做的,因為如果你的線程因為一些工作因為線程堆棧不夠的話,會導致整個進程崩潰.修改堆棧的方法好像只在XP或以上系統有效,windows 2000中不支持。