偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java線程模型如何完善相關(guān)的數(shù)據(jù)處理

開(kāi)發(fā) 后端
Java線程模型只有在不斷的學(xué)習(xí)中才能更好的掌握相關(guān)問(wèn)題的解決方案。下面我們就詳細(xì)的來(lái)看看如何才能更好的掌握相關(guān)的方案。

Java線程模型在使用耳朵時(shí)候需要大家不斷的進(jìn)行學(xué)習(xí),下面我們就看看如何才能更好的掌握相關(guān)的技術(shù)語(yǔ)言,判斷是搶占式還是協(xié)作式的Java線程模型,取決于虛擬機(jī)的實(shí)現(xiàn)者,并根據(jù)各種實(shí)現(xiàn)而不同。因此,Java開(kāi)發(fā)員必須編寫(xiě)那些能夠在兩種模型上工作的程序。

正如前面所提到的,在搶占式模型中線程可以在代碼的任何一個(gè)部分的中間被打斷,除非那是一個(gè)原子操作代碼塊。原子操作代碼塊中的代碼段一旦開(kāi)始執(zhí)行,就要在該線程被換出處理器之前執(zhí)行完畢。在 Java 編程中,分配一個(gè)小于32位的變量空間是一種原子操作,而此外象double和long這兩個(gè)64位數(shù)據(jù)類(lèi)型的分配就不是原子的。使用鎖來(lái)正確同步共享資源的訪問(wèn),就足以保證一個(gè)多線程程序在搶占式模型下正確工作。#t#

而在協(xié)作式模型中,是否能保證線程正常放棄處理器,不掠奪其他線程的執(zhí)行時(shí)間,則完全取決于程序員。調(diào)用yield()方法能夠?qū)?dāng)前的線程從處理器中移出到準(zhǔn)備就緒隊(duì)列中。另一個(gè)方法則是調(diào)用sleep() 方法,使Java線程模型放棄處理器,并且在 sleep 方法中指定的時(shí)間間隔內(nèi)睡眠。

正如你所想的那樣,將這些方法隨意放在代碼的某個(gè)地方,并不能夠保證正常工作。如果線程正擁有一個(gè)鎖(因?yàn)樗谝粋€(gè)同步方法或代碼塊中),則當(dāng)它調(diào)用yield()時(shí)不能夠釋放這個(gè)鎖。這就意味著即使這個(gè)Java線程模型已經(jīng)被掛起,等待這個(gè)鎖釋放的其他線程依然不能繼續(xù)運(yùn)行。為了緩解這個(gè)問(wèn)題,最好不在同步方法中調(diào)用yield方法。將那些需要同步的代碼包在一個(gè)同步塊中,里面不含有非同步的方法,并且在這些同步代碼塊之外才調(diào)用yield。

另外一個(gè)解決方法則是調(diào)用wait()方法,使處理器放棄它當(dāng)前擁有的對(duì)象的鎖。如果對(duì)象在方法級(jí)別上使同步的,這種方法能夠很好的工作。因?yàn)樗鼉H僅使用了一個(gè)鎖。如果它使用fine-grained鎖,則wait() 將無(wú)法放棄這些鎖。此外,一個(gè)因?yàn)檎{(diào)用wait()方法而阻塞的線程,只有當(dāng)其他線程調(diào)用notifyAll()時(shí)才會(huì)被喚醒。

Java線程模型模型和 AWT/Swing

在那些使用Swing 和/或AWT包創(chuàng)建GUI(用戶(hù)圖形界面)的Java程序中,AWT事件句柄在它自己的線程中運(yùn)行。開(kāi)發(fā)員必須注意避免將這些GUI線程與較耗時(shí)間的計(jì)算工作綁在一起,因?yàn)檫@些線程必須負(fù)責(zé)處理用戶(hù)時(shí)間并重繪用戶(hù)圖形界面。換句話來(lái)說(shuō),一旦GUI線程處于繁忙,整個(gè)程序看起來(lái)就象無(wú)響應(yīng)狀態(tài)。Swing線程通過(guò)調(diào)用合適方法,通知那些Swing callback(例如 Mouse Listener 和 Action Listener )。這種方法意味著listener無(wú)論要做多少事情,都應(yīng)當(dāng)利用listener callback方法產(chǎn)生其他線程來(lái)完成此項(xiàng)工作。目的便在于讓listener callback更快速返回,從而允許Swing線程響應(yīng)其他事件。

如果一個(gè)Swing線程不能夠同步運(yùn)行、響應(yīng)事件并重繪輸出,那怎么能夠讓其他的線程安全地修改 Swing的狀態(tài)?正如上面提到的,Swing callback在Swing 線程中運(yùn)行。因此他們能修改Swing數(shù)據(jù)并繪到屏幕上。

但是如果不是Swing callback產(chǎn)生的變化該怎么辦呢?使用一個(gè)非Swing線程來(lái)修改Swing數(shù)據(jù)是不安全的。Swing提供了兩個(gè)方法來(lái)解決這個(gè)問(wèn)題:invokeLater()和invokeAndWait()。為了修改Swing狀態(tài),只要簡(jiǎn)單地調(diào)用其中一個(gè)方法,讓Runnable的對(duì)象來(lái)做這些工作。因?yàn)镽unnable對(duì)象通常就是它們自身的線程,你可能會(huì)認(rèn)為這些對(duì)象會(huì)作為線程來(lái)執(zhí)行。但那樣做其實(shí)也是不安全的。事實(shí)上,Swing會(huì)將這些對(duì)象放到隊(duì)列中,并在將來(lái)某個(gè)時(shí)刻執(zhí)行它的run方法。這樣才能夠安全修改Swing狀態(tài)。

Java 語(yǔ)言的設(shè)計(jì),使得多線程對(duì)幾乎所有的Applet都是必要的。特別是,IO和GUI編程都需要多線程來(lái)為用戶(hù)提供完美的體驗(yàn)。如果依照本文所提到的若干基本規(guī)則,并在開(kāi)始編程前仔細(xì)設(shè)計(jì)系統(tǒng)——包括它對(duì)共享資源的訪問(wèn)等,你就可以避免許多常見(jiàn)和難以發(fā)覺(jué)的Java線程模型陷阱。

 

責(zé)任編輯:張浩 來(lái)源: 博客園
相關(guān)推薦

2009-12-25 15:58:37

WPF數(shù)據(jù)處理

2024-02-07 09:25:52

數(shù)據(jù)處理快手大模型

2025-06-16 07:07:03

Java數(shù)據(jù)Jackson

2023-11-29 13:56:00

數(shù)據(jù)技巧

2009-07-15 18:06:38

Swing線程

2017-07-21 14:22:17

大數(shù)據(jù)大數(shù)據(jù)平臺(tái)數(shù)據(jù)處理

2013-12-16 17:17:01

OpenMp數(shù)據(jù)處理

2023-07-31 08:21:22

語(yǔ)法校對(duì)器Pick

2023-10-05 12:43:48

數(shù)據(jù)處理

2019-01-25 13:22:50

RocketMQ數(shù)據(jù)處理

2024-01-31 23:22:35

vaexPython庫(kù)

2016-12-13 11:48:05

數(shù)據(jù)處理不平衡數(shù)據(jù)

2024-04-01 10:07:47

應(yīng)用程序數(shù)據(jù)數(shù)據(jù)庫(kù)

2018-12-07 14:50:35

大數(shù)據(jù)數(shù)據(jù)采集數(shù)據(jù)庫(kù)

2020-11-02 15:56:04

大數(shù)據(jù)數(shù)據(jù)庫(kù)技術(shù)

2025-01-07 13:58:08

SQL數(shù)據(jù)處理函數(shù)數(shù)據(jù)庫(kù)

2010-04-12 11:12:53

Oracle數(shù)據(jù)處理

2018-08-14 11:05:25

2014-06-05 09:29:03

數(shù)據(jù)處理

2015-06-16 16:49:25

AWSKinesis實(shí)時(shí)數(shù)據(jù)處理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)