導航:首頁 > 編程語言 > java非同步通知

java非同步通知

發布時間:2023-05-28 13:52:53

Ⅰ 全面了解java媒體架構JMF

Java媒體架構(JMF)是一個令人激動的通用的API 它允許Java開發者用許多不同的方法處理媒體 本指南主要通過使用工作的例子提供一個JMF的一些主要的特徵的概述 閱讀完本指南後 你將會明白JMF體系結構中的主要播放功能 你同樣能正確的使用JMF 使用現存的例子和可為更多特殊功能擴展的源代碼

本指南包含著以下主題

· 下載和安裝JMF

· 主要的JMF類以及它們在JMF體系結構中的應用

· 播放本地的媒體文件

· 為媒體的存取和操作製作以和圖形用戶界面(GUI)

· 通過網路傳播媒體

· 通過網路接收媒體

幾乎所有的媒體類型的操作和處理都可以通過JMF來實現 全面的討論JMF所提供的所有特徵已經超過了本指南的范圍 我們將使用三個簡單的媒體應用程序來學習此框架的構建模塊 通過這個方法 本指南將為你未來學習和實施更多特殊的應用提供准備

我應該使用此指南嗎?

本指南會帶你學習使用JMF工作的基礎 為完成這些 我們會創建三個的獨立工作的常式序 每個例子都會建立前一個例子的基礎上 顯示JMF功能性的不同方面

在本指南中的例子假定你曾經使用過並且已經熟悉了Java程序語言 除了Java核豎衡頌心和JMF的類之外 我們會使用一些Java AWT和Swing類(用於創建GUI) 也會有一些Java網路類(用於在網路中傳輸媒體) 對GUI和網路類一些熟悉有助於你更快的明白觀點和這里的例子 但並非是閱讀本指南必須的

我們將學習的常式序如下

· 一個簡單的音頻播放器(JMF的HelloWorld應用) 這個字元界面的播放器通過在命令行中簡單的輸入媒攔吵體文件的名字就可以播放大多數的音頻類型 此音頻播放器的演示大體上顯示了JMF的特有的類

· 一個圖形界面的媒體播放器 我們將使用JMF內置的介面組件來建立圖形界面 所以在此練習中必須有一些圖形界面的編程經驗 這個媒體閱覽器演示使用了一些Java AWT和Swing類來為用戶顯示圖形組件

· 一個媒體廣播應用 此應用程序允許一個本地媒體文件通過網路傳播 此程序能靈活的使媒體只傳輸到指定的網路節點 或者傳輸到一個子網余鄭絡中的所有節點 此演示使用了一些Java的網路APIs來在網路中傳輸媒體

作為第三個練習的一部分 我們將修改圖形界面的播放器 讓其能接收並且播放媒體

跳至 頁觀看Resources 文章 指南 和其他參考書目的列表 這會幫助你學習到更到關於此指南包括的主題

安裝需求

要運行此指南中的常式序 你需要如下的工具和組件

·Java 平台 標准版 編譯和運行演示程序

·Java媒體框架 版本 a或者更高

· 一塊已經安裝並且配置號的適當的音效卡

· 一台或者多台測試機器

· 演示的源代碼文件在mediaplayer jar中

最後的一個演示應用顯示了JMF在網路中的應用 如果需要 此演示能運行在一個獨立的機器上 使用此機器即是傳輸方也是接收方 可是要觀察到在網路中使用JMF的所有功能 你仍然需要至少兩台聯網的機器

在 頁中的Resources可下載Java 平台 完整的源代碼文件 以及其他一些完成本指南所需要的工具

下載安裝文件

將JMF安裝到你的計算機中的第一步是在JMF的主頁中下載安裝文件 它同樣包括了JMF源代碼和API文檔的鏈接 頁的Resources中有下載JMF的鏈接

目前 JMF有Windows Solaris Linux等版本 以及可運行在任何裝有虛擬機的計算機上一個純Java版本 為了增加性能 你需要下載一個與你操作系統所適應的版本 任何在一個操作系統JMF版本下書寫和編譯的代碼都可以方便的移植到另外的操作系統上 例如 如果你下載了一個Solaris版本的JMF並且編譯了一個類 這些類就可以在Linux上使用 不會有任何問題

作為選擇 你可以選擇下載純Java版本 或者跨平台版本的JMF 這些版本沒有使用操作系統特有的庫文件 如果沒有合適的JMF版本適合的操作系統 那麼跨平台版本就是一個不錯的選擇

安裝JMF

下載完JMF安裝程序後 雙擊安裝程序的圖標

大部分安裝程序都會有個選項 安裝本地庫到系統目錄中;例如 Windows版本安裝程序會有一個選項 Move DLLs to Windows/System directory 最好將此選項選中 因為它能確保這些操作系統的庫文件能正確的安裝

在安裝的過程中 你還需要選擇項目來更新系統的CLASSPATH和PATH變數 如果這些選項被關閉 那麼在你編譯和運行本指南的常式序的時候就需要在classpath中引入JMF的jar文件

第二節 一個簡單的音頻播放器

瀏覽

在本節中 我們將進行創建一個簡單的音頻播放器的第一個練習 本例將介紹Manager類和Player介面 中兩個都是建立大多數基於JMF應用的重要部分

本例的功能目標是在字元界面下播放本地的音頻文件 我們將學習此源代碼 並了解每一行所做的任務 完成本節後 你將會有一個基於JMF的可播放包括MP WAV AU等多種音頻文件的演示程序

在本練習後的源代碼分類種可查詢文件SimpleAudioPlayer java

引入必要的類

SimpleAudioPlayer類中包括了一些調用 在其前幾行中需要引入所有必要的類

import dia *;import java io File;import java io IOException;import URL;import MalformedURLException;

The dia包是由JMF定義的多個包之一 dia是一個核心包 包括了定義Manager類和Player介面等 本節中 我們主要學習Manager類和Player介面 其餘的dia類放在後面的章節中

除了引入dia聲明外 以上的代碼片斷引入了一些創建媒體播放器的輸入的聲明

Player介面

在下面的代碼片斷中 創建一個公共類SimpleAudioPlayer並舉例定義一個Player變數

public class SimpleAudioPlayer {private Player audioPlayer = null;

術語Player聽起來由點熟悉 因為它是建立在我們公用的音頻或者視頻播放器的基礎上的 事實上 這個介面的例子就像是當作它們的真實的副本 Players揭示了一個實體上的媒體播放器(如立體音箱系統或者VCR)涉及到功能上的方法 例如 一個JMF媒體播放器可以開始和結束一個媒體流 在本節種 我們將使用Player的開始和結束功能

在一個文件上創建一個Player

使用JMF獲得一個特定媒體文件的Player實例非常簡單 Manager類在JMF中如同一個工廠製作許多的特殊介面類型 包括Player介面 因此 Manager類的責任就是創建Player實例 如下例

public SimpleAudioPlayer(URL url) throws IOException NoPlayerException CannotRealizeException{audioPlayer = Manager createRealizedPlayer(url);}public SimpleAudioPlayer(File file) throws IOException NoPlayerException CannotRealizeException{this(file toURL());

如果你看完本節的代碼 你可以注意到Manager類包含了創建一個Player實例的其他方法 我們會研究其中的一些 如在後面的章節中的DataSource或者MediaLocator的實例化

Player的狀態

JMF定義了大量的一個Player實例可能存在的不同狀態 如下

· Prefetched

· Prefetching

· Realized

· Realizing

· Started

· Unrealized

使用這些狀態

因為使用媒體常常是資源非常密集的 由JMF對象揭示的許多方法都是不閉塞的 允許一系列事件監聽的狀態改變的非同步通知 例如 一個Player在它可以啟動之前 必須經過Prefetched和Realized狀態 由於這些狀態的改變都需要一些時間來完成 JMF媒體應用可以分配一個線程來初始化創建Player實例 然後再繼續其他的操作 當Player准備就緒的時候 它會通知應用程序其狀態已經改變

在一個如同我們的這樣簡單的程序中 多功能性的類型並不是很重要 處於這個原因 Manager類也提供了一些創建Realized player的有用方法 調用一個createRealizedPlayer()方法來阻塞調用線程 直到player達到Realized狀態 為了調用一個無阻塞的創建player的方法 我們在Manager類中使用了一個createPlayer()方法 下面的一行代碼中創建了一個我們需要在常式序中使用的

Realized player audioPlayer = Manager createRealizedPlayer(url);

啟動和停止Player

設定一個Player實例的啟動或是停止就如同調用Player的一個簡單的認證方法 如下所示

public void play() {audioPlayer start();}public void stop() {audioPlayer stop();audioPlayer close();}

調用SimpleAudioPlayer類中的play()方法來實現調用Player實例的start()方法 調用此方法後 你能聽到本地的喇叭的聲音文件 同樣的 stop()方法使player停止並且關閉掉Player對象

對於讀取和或者播放本地媒體文件來說 關閉Player實例釋放所有資源是一個有用的方法 因為這是一個簡單的例子 關閉Player是終止一個會話可接受的方法 但是在實際的應用中 你需要小心的確認在除掉Player之前必須要關閉掉 一但你已經關閉掉player 在再次播放一個媒體之前你必須要創建一個新的Player實例

lishixin/Article/program/Java/hx/201311/26628

Ⅱ 求 JAVA 非同步觀察者模式 的源代碼(完整的),不要同步的,好的給加分

package TestObserver;

import java.util.Iterator;
import java.util.Vector;

/**
*
* @author Seastar
*/
interface Observed {

public void addObserver(Observer o);

public void removeObserver(Observer o);

public void update();
}

interface Observer {

public void takeAction();
}

class Invoker {

private Observer o;
Handler handler;

public Invoker(Observer o) {
new Handler();
this.o = o;
}

private class Handler extends Thread {

public Handler() {
handler = this;
}

@Override
public void run() {
o.takeAction();
}
}

public boolean TestSameObserver(Observer o) {
return o == this.o;
}

public void invoke() {
handler.start();
}
}

class ObservedObject implements Observed {

private Vector<Invoker> observerList = new Vector<Invoker>();

public void addObserver(Observer o) {
observerList.add(new Invoker(o));
}

public void removeObserver(Observer o) {
Iterator<Invoker> it = observerList.iterator();
while (it.hasNext()) {
Invoker i = it.next();
if (i.TestSameObserver(o)) {
observerList.remove(i);
break;
}
}
}

public void update() {
for (Invoker i : observerList) {
i.invoke();
}
}
}

class ObserverA implements Observer {

public void takeAction() {
System.out.println("I am Observer A ,state changed ,so i have to do something");
}
}

class ObserverB implements Observer {

public void takeAction() {
System.out.println("I am Observer B ,i was told to do something");
}
}

class ObserverC implements Observer {

public void takeAction() {
System.out.println("I am Observer C ,I just look ,and do nothing");
}
}

public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ObserverA a = new ObserverA();
ObserverB b = new ObserverB();
ObserverC c = new ObserverC();
ObservedObject oo = new ObservedObject();
oo.addObserver(a);
oo.addObserver(b);
oo.addObserver(c);
for (int i = 0; i < 5; ++i) {
oo.addObserver(new Observer() {

public void takeAction() {
System.out.println("我是山寨觀察者"+",誰敢攔我");
}
});
}
//sometime oo changed ,so it calls update and informs all observer
oo.update();
}
}

觀察者模式的精髓在於注冊一個觀察者觀測可能隨時變化的對象,對象變化時就會自動通知觀察者,
這樣在被觀測對象影響范圍廣,可能引起多個類的行為改變時很好用,因為無需修改被觀測對象的代碼就可以增加被觀測對象影響的類,這樣的設計模式使得代碼易於管理和維護,並且減少了出錯幾率

至於非同步機制實際是個噱頭,可以有觀測對象來實現非同步,也可以有觀察者自身實現,這個程序實際是觀測對象實現了非同步機制,方法是在觀察者類外包裝了一層invoker類

Ⅲ java關於非同步請求http介面

非同步請求,那就是開啟一條線程來發個http請求
等這條線程得到數據後,再通知主線程
android上的話,就有一個非同步任務AnsyTask就是用來處理非同步任務了

Ⅳ java中如何設計非同步調用介面,用監聽實現非同步結果的通知

向對方注冊本地的接收介面
像微信

~~~~~~~~

Ⅳ 如何用Java回調和線程實現非同步調用

軟體模塊之間的調用關系可以分為兩大類:即同步調用和非同步調用。在同步調用中,一段代碼(主調方)調用另一段代碼(被調方),主調方必須等待這段代碼執行完成返回結果後,才能繼續往下執行,所以,同步調用是一種阻塞式調用,主調方代碼一直阻塞等待直到被調方返回為止。同步調用相對比較直觀,也是大部分編程語言直接支持的一種調用方式。但是,同步調用在處理比較耗時的情況下會嚴重影響程序性能,影響人機交互的瞬時反應。例如,某個程序需要訪問資料庫獲取大量數據,然後根據這些數據進行一系列處理,將處理結果顯示在程序主窗口。由於資料庫訪問和大量數據的處理都是耗時的工作,在這個工作完成之前,處理結果遲遲不能顯示,用戶點擊滑鼠也不會立即得到響應,讓用戶感到整個程序顯得很沉重。面對這樣一些需要比較長時間才能完成的應用場景,我們需要採用一種非阻塞式調用方式,即非同步調用方式。在非同步調用中,主調方調用被調方後,不等待對方返回結果就繼續執行後續代碼,被調方執行完畢後,通過某種手段通知調用方:結果已經出來,請酌情處理。我們可以對上面的例子改用非同步調用將問題輕松化解:把整個耗時的工作放進一個單獨的線程,由主調方啟動此線程後繼續執行後續代碼,線程在背後悄悄地處理費時的工作,當工作完成,採用回調的方式通知主調方工作完成,主調方將結果顯示在主窗口。經過這樣的處理,主界面繼續進行自己的工作而不必死等,就不會造成界面響應遲鈍。
在實現非同步調用機制時,除了線程之外,還要用到回調。回調是一種雙向調用,也就是,被調方在被調用時也會調用主調方的代碼。在非同步調用中,被調方需要在工作完成時通知主調方,即調用主調方的介面,這一機制通過回調實現。回調和非同步調用的關系非常緊密,回調是非同步調用的基礎[1]。
本文理論聯系實際,首先闡述如何使用Java實現回調機制,然後進一步闡述使用Java回調和線程實現非同步調用,最後,闡述在非同步調用中如何處理超時問題。
1 Java回調機制的實現方法
實現Java回調,需要做如下三件事情:
(1)定義一個回調介面CallbackInterface
介面中聲明回調方法handle,如圖1所示,回調方法就是一個普通的方法,接收一個消息字元串或者一個封裝了數據的事件。
(2)定義一個類實現回調介面
這個類其實就是消息接收者和處理者,也就是調用方,回調方法是消息發生時實際處理消息的方法,此處簡化為一條列印語句。
(3)定義消息通知者
消息通知者也就是被調用方必須具備兩種能力,第一,它必須知道誰是消息接收者,第二,當消息發生時,它能夠回調這些接收者的回調方法。為了獲得這兩種能力,消息通知者首先必須提供一個注冊方法register, 通過注冊的方式來注冊多個對此消息或事件感興趣的對象。然後提供一個消息通知方法notifyMessage,在這個方法中調用所有消息接收者的回調方法。具體代碼如圖3所示。
比如用一個可變數組List用於保存消息接收者,注冊的過程實際上是將消息接收者添加到這個數組,以備在需要通知消息的時候調用這些消息接收者的回調方法。
使用Java回調和線程實現非同步調用
線程是一個獨立的執行流,其本質是程序中一段並發執行的代碼。在非同步調用機制中引入線程,在線程中完成耗時的工作,其目的是讓調用方的主線程繼續執行後續代碼而不需要等待被調方的結果返回。由於不需要等待,這樣我們就等於同時做了兩件事情,而這兩件事情分別是在不同的執行流中執行,主調者在當前的主線程中執行,被調者在另外一個線程中執行,因此提高了程序的效率,避免了界面的響應遲鈍。當被調者執行完成後,仍然採用回調通知主調者。
例如LongTimeWorker是一個用於完成耗時工作的線程,同時又是消息通知者。其耗時工作在run方法中完成,另外提供一個注冊方法register, 和一個消息通知方法notifyMessage,在run方法的最後,即耗時工作完成以後,調用notifyMessage將消息廣播出去。
3 非同步調用中超時問題的處理
非同步調用通常都要加入超時機制,因為我們總是希望在一個指定的時間范圍內返回一個結果,即使沒有得到結果也該有個超時通知。這時我們需要使用「限時線程回調方式」,它在原有線程回調的基礎上加上一個計時器Timer以計算消耗的時間,如果時間期限到了任務還沒有執行完成即中斷線程,並將超時消息廣播出去。LongTimeWorker類需要修改部分的代碼如圖8和圖9所示。
首先LongTimeWorker線程類增加了一個構造方法,其參數是超時時間timeout,構造方法的主要任務是創建一個定時器,每秒鍾計時一次,若超時時間到則終止本線程,並廣播超時消息。LongTimeWorker線程類的第二個改變發生在其run方法中,線程一啟動立即開始計時,完成工作後停止計時,並廣播消息。
4 結束語
非同步調用是一種非阻塞式調用方式,用於在處理比較耗時的任務時保證程序性能不受到影響。實現非同步調用的關鍵在於要解決三個技術難題,它們分別是程序阻塞問題、非同步消息的傳遞問題和超時問題。本文介紹的方法採用並發線程、回調機制和計時器使上述問題得到了圓滿解決。

閱讀全文

與java非同步通知相關的資料

熱點內容
安卓怎麼下載正版刺激戰場 瀏覽:235
xrv本田壓縮比 瀏覽:63
空調耗電量手機app怎麼看 瀏覽:723
伺服器怎麼登錄u8 瀏覽:909
明星pdf 瀏覽:270
判斷手機訪問php 瀏覽:119
appstory怎麼設密碼 瀏覽:798
程序員月薪3萬 瀏覽:261
flash反編譯覆蓋碼怎麼找 瀏覽:196
女大男小忘年戀題材電影 瀏覽:83
築業軟體如何查找加密鎖 瀏覽:114
電信盒子系統升級伺服器地址 瀏覽:584
海康威視伺服器如何設置dns 瀏覽:911
空調壓縮機檢測方法 瀏覽:529
程序員的工資多少錢啊 瀏覽:966
faka.369kuai。com/details/022D34D2 瀏覽:626
主角一開始是個小孩子的小說 瀏覽:568
為什麼安卓手機拍抖音沒有蘋果好 瀏覽:367
關鍵點pdf 瀏覽:535
linuxpython版本查看 瀏覽:242