javalistener
『壹』 關於java listener問題
SendMailTimer
你先確認它到底是抽象類,還是實現類(可能實現函數是空函數,不做任何事)版。那這種顯然沒問題了。權
如果SendMailTimer 它是個介面,不能實例化,我猜測這種情況系統一般也會正常運作,就像你這里個地方配置了一個不正確的 類路徑。因為系統在解析xml的時候,要通過反射機制來實例化一個對象,可以在實例化過程中判斷是否可實例化,是否是指定介面的實現,這些異常檢測我相信 WEB容器應該是做了的。
『貳』 java的listener是什麼原理
用的觀察者模式,jdk提供了Observer 和 Observable來對持觀察模式
『叄』 在java中有多少種不同的listener
最好下一個java文檔
那裡面你就可以看到你想要的了
『肆』 oracle的監聽器listener 和 java web的監聽器listener 的聯系是什麼
區別如下:
1、從定義方面的區別:
1)oracle監聽器是Oracle基於伺服器端的一種網路服務,主要用於監聽客戶端向資料庫伺服器端提出的連接請求。既然是基於伺服器端的服務,那麼它也只存在於資料庫伺服器端,進行監聽器的設置也是在資料庫伺服器端完成的。
2)java web中的listener可以監聽web伺服器中某一個執行動作,並根據其要求作出相應的響應。通俗的語言說就是在application,session,request三個對象創建消亡或者往其中添加修改刪除屬性時自動執行代碼的功能組件。比如spring 的總監聽器 會在伺服器啟動的時候實例化配置的bean對象 、 hibernate 的 session 的監聽器會監聽session的活動和生命周期,負責創建,關閉session等活動。
2、從實現方面的區別:
oracle的監聽是基於網路和埠號實現的:
Servlet的監聽器Listener,它是實現了javax.servlet.ServletContextListener 介面的伺服器端程序,它也是隨web應用的啟動而啟動,只初始化一次,隨web應用的停止而銷毀。主要作用是: 做一些初始化的內容添加工作、設置一些基本的內容、比如一些參數或者是一些固定的對象等等。
二者的聯系:都是通過後台守護進程捕獲某一事件的發生。
『伍』 關於java的Listener
一看就是當復窗口關閉的時候退出製程序啊
學習Ui最好還是找個例子看一遍,自己再敲一遍,不會了就看看,然後再自己不看,敲一遍,理解透一個了,之後再看別的就輕松點了,然後一點一點的向功能完善和難度增加的方向發展,很快就能上手了
『陸』 java中,addlistener的用法,請舉例說明
兩個this都指的是當前類的當前實例(類對象)。Java里的this比較簡單,只能表示當前的類對版象,」當權前「就是指的this關鍵字寫在的類代碼。然後回到說說你這個this.addWindowListener(this);前一個this.addWindowListene()r能起作用,是因為你的當前類是java.awt.Window類或其子類,因為addWindowListener()這個方法是java.awt.Window類里的。後一個this能放到addWindowListener()的參數裡面,是因為你的當前類必定實現了WindowListener的介面(當然也可能是繼承了實現這個介面的類,效果一樣),因為addWindowListener()要求的參數類型就是WindowListener(java.awt.event.WindowListener)
『柒』 java的listener是什麼原理
回調,
Java的事件監聽機制是這樣的:
事件的觀察者向事件的發出者進行注冊,當事件發生時,事件的發出者調用之前注冊的回調函數,將相關事件信息通知到事件的觀察者。這個過程中,當然不用事件的觀察者進行輪詢。
你可能有個問題:那麼事件的發出者如何得知事件發生呢?實際上舉個例子來說如窗口類,有個窗口關閉事件可以注冊,作為窗口類來說內部有相關關閉窗口的方法,只要這些方法被調用,當然就知道窗口被關閉了,只要這些方法在合適的時機調用回調函數即可。
事件的觀察者可以沒有,有一個或多個,只要再事件的發出者內部維護一個List<XxxListener>即可,到時候迭代列表依次發出事件即可。(這里一般不設計為多線程,而是單線程依次發送,所以事件處理函數最好不要阻塞太長時間,否則會影響到下一個觀察者,甚至事件發出方代碼的調用)
Java 事件處理方法是基於授權事件模型
事件源生成事件並將其發送至一個或多個監聽器
監聽器簡單地等待,直到它收到一個事件。一旦事件被接受,監聽器將處理這些事件,然後返回。
事件:在授權事件模型中,事件是一個描述事件源狀態改變的對象 。
通過滑鼠、鍵盤與 GUI 界面直接或間接交互都會生成事件。 如:按下一個按鈕、通過鍵盤輸入一個字元、選擇列表框中的一項、點擊一下滑鼠等。
事件源:事件源是一個生成事件的對象
一個事件源可能會生成不同類型的事件
事件源提供了一組方法,用於為事件注冊一個或多個監聽器。
每種事件的類型都有其自己的注冊方法。一般形式為:
public void add<EventType>Listener (TypeListener e)
AWT採取的事件控制過程:監聽器對象屬於一個類的實例,這個類實現了一個特殊的介面,名為「監聽者介面」
事件源是一個對象,它可以注冊一個或多個監聽器對象,並向其發送事件對象。
事件源將在發生事件時向所有注冊的監聽器發送事件對象。
監聽器對象使用事件對象中的信息來確定它們對事件的響應
事件模型:
1.基於代理(授權)事件模型
事件處理是一個事件源授權到一個或者多個事件監聽器。其基本原理是:組件激發事件,事件監聽器監聽和處理事件,可以調用組件的add<EventType>Listener方法向組件注冊監聽器。把其加入到組件以後,如果組件激發了相應類型的事件,那麼定義在監聽器中的事件處理方法會被調用。
2.此模型主要由以三種對象為中心組成
事件源 由它來激發產生事件
是產生或拋出事件的對象。
事件監聽器 由它來處理事件
實現某個特定EventListener 介面,此介面定義了一種或多種方法,事件源調用它們以響應該介面所處理的每一種特定事件類型 。
事件 具體的事件類型
事件類型封裝在以java.util.EventObject為根的類層次中。當事件發生時,事件記錄發生的一切事件,並從事件源傳播到監聽器對象
『捌』 java listener是抽象類還是介面
是介面。介面是抽象方法的集合。如果一個類實現了某個介面,那麼它就繼承了這個介面的抽象方法。這就像契約模式,如果實現了這個介面,那麼就必須確保使用這些方法。介面只是一種形式,介面自身不能做任何事情。
『玖』 java listener 線程安全嗎
一、簡單介紹
在我們用框架編程的過程中,經常不用太關注多線程問題,這是因為例如Servlet和RMI(Remote Method Invocation,遠程方法調用),RMI使得代碼能夠調用其他JVM中的運行的對象。這些框架負責解決一些細節問題,例如請求管理、線程創建、負載均衡,並在正確的時刻將請求分發給正確的應用程序組件。編寫Servlet的開發人員不需要了解有多少請求在同一時刻要被處理,也不需要了解套接字的輸入流或輸出流是否被阻塞。當調用Servlet的service方法來響應Web請求時,可以以同步方式來處理這個請求,就好像它是一個單線程程序。這種方式可以簡化組件的開發,並縮短掌握這種框架的學習時間,但我們想學好編程,還是需要學習並發編程
1、編程的一些原則
在編寫並發應用程序時,一種正確的編程方法就是:首先使代碼正確運行,然後再提高代碼的速度。即便如此,最好也只是當性能測試結果和應用需求告訴你必須提高性能,以及測量結果表明這種優化在實際環境中確實能帶來性能提升時,才進行優化
2、活躍性問題
多線程中提到的活躍性問題,指的就是讓線程處理死鎖或活鎖,就是各個線程阻塞不執行,當某個操作無法繼續執行下去時,這樣就導致了活躍性問題
平時編程中應該怎樣做到這句話?:框架通過在框架線程中調用應用程序代碼將並發性引入到程序中。在代碼中將不可避免地訪問應用程序狀態,因此所有訪問這些狀態的代碼路徑都必須是線程安全的
3、一般並發錯誤的修復方法
如果當多個線程訪問同一個可變的狀態變數時沒有使用合適的同步,那麼程序就會出現錯誤。有三種方式可以修復這個問題:
(1)不在線程之間共享該狀態變數
(2)將狀態變數修改為不可變的變數
(3)在訪問狀態變數時使用同步
4、線程安全類和線程安全程序
完全由線程安全類構成的程序並不一定就是線程安全的,而在線程安全類中也可以包含非線程安全的類
二、線程安全性
當多個線程訪問某個類時,這個類始終都能表現出正確的行為,那麼就稱這個類是線程安全的
1、無狀態對象
一個無狀態的Servlet
[java] view plain
import java.math.BigInteger;
import javax.servlet.*;
import net.jcip.annotations.*;
@ThreadSafe
public class StatelessFactorizer extends GenericServlet implements Servlet {
public void service(ServletRequest req, ServletResponse resp) {
BigInteger i = extractFromRequest(req);
BigInteger[] factors = factor(i);
encodeIntoResponse(resp, factors);
}
}