thrift java多執行緒非阻塞同步/非同步呼叫例項
作者:呂桂強
首先建立thrift檔案
namespace java thriftservice Hello{ string helloString(1:string para)}
執行thrift -gen java test.thrift會生成一個Hello.java檔案
將Hello.java檔案拷貝至IDE
server端程式碼:
package com.thrift.test.thrift; import org.apache.thrift.TProcessorFactory; import org.apache.thrift.protocol.TCompactProtocol; import org.apache.thrift.server.THsHaServer; import org.apache.thrift.server.TServer; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TNonblockingServerSocket; import org.apache.thrift.transport.TTransportException; /** * @author 呂桂強 * @email[email protected] * @version 建立時間:2012-4-24 下午8:14:50 */ public class Server { public final static int PORT = 8989; @SuppressWarnings({ "rawtypes", "unchecked" }) private void start() { try { TNonblockingServerSocket socket = new TNonblockingServerSocket(PORT); final Hello.Processor processor = new Hello.Processor(new HelloImpl()); THsHaServer.Args arg = new THsHaServer.Args(socket); // 高效率的、密集的二進位制編碼格式進行資料傳輸 // 使用非阻塞方式,按塊的大小進行傳輸,類似於 Java 中的 NIO arg.protocolFactory(new TCompactProtocol.Factory()); arg.transportFactory(new TFramedTransport.Factory()); arg.processorFactory(new TProcessorFactory(processor)); TServer server = new THsHaServer(arg); server.serve(); System.out.println("#服務啟動-使用:非阻塞&高效二進位制編碼"); } catch (TTransportException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]) { Server srv = new Server(); srv.start(); } }
client端程式碼:
package com.thrift.test.Async;
import java.io.IOException;
import org.apache.thrift.TApplicationException;
import org.apache.thrift.TException;
import org.apache.thrift.async.TAsyncClientManager;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.protocol.TProtocolFactory;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingSocket;
import org.apache.thrift.transport.TNonblockingTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
/**
* @author 呂桂強
* @email [email protected]
* @version 建立時間:2012-4-24 下午8:17:38
*/
public class Client {
public static final String address = "127.0.0.1";
public static final int port = 8989;
public static final int clientTimeout = 30000;
public static void main_syn() {
TTransport transport = new TFramedTransport(new TSocket(address, port, clientTimeout));
TProtocol protocol = new TCompactProtocol(transport);
Hello.Client client = new Hello.Client(protocol);
try {
transport.open();
System.out.println(client.helloString("larry"));
} catch (TApplicationException e) {
System.out.println(e.getMessage() + " " + e.getType());
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
}
transport.close();
}
public static void main_asy() throws Exception {
try {
TAsyncClientManager clientManager = new TAsyncClientManager();
TNonblockingTransport transport = new TNonblockingSocket(address, port, clientTimeout);
TProtocolFactory protocol = new TCompactProtocol.Factory();
Hello.AsyncClient asyncClient = new Hello.AsyncClient(protocol, clientManager, transport);
System.out.println("Client calls .....");
MyCallback callBack = new MyCallback();
asyncClient.helloString("larry", callBack);
while (true) {
Thread.sleep(1);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
main_asy();
}
}
client使用到的回撥函式:
package com.thrift.test.Async;
import org.apache.thrift.TException;
import org.apache.thrift.async.AsyncMethodCallback;
import com.thrift.test.Async.Hello.AsyncClient.helloString_call;
/**
* @author 呂桂強
* @email [email protected]
* @version 建立時間:2012-4-25 上午11:17:32
*/
public class MyCallback implements AsyncMethodCallback<helloString_call> {
// 返回結果
@Override
public void onComplete(helloString_call response) {
System.out.println("onComplete");
try {
System.out.println(response.getResult().toString());
} catch (TException e) {
e.printStackTrace();
}
}
// 返回異常
@Override
public void onError(Exception exception) {
System.out.println("onError");
}
}
相關推薦
thrift java多執行緒非阻塞同步/非同步呼叫例項
作者:呂桂強 郵箱:[email protected] 首先建立thrift檔案 namespace java thriftservice Hello{ string helloString(1:string para)} 執行thrift -ge
java多執行緒10.構建同步工具
建立狀態依賴類的最簡單方法通常是在類庫中現有狀態依賴類的基礎上進行構造。如果類庫中沒有提供你需要的功能,可以使用java語言和類庫提供的底層機制來構造自己的同步機制,包括內建的條件佇列、顯示地Condition物件以及AbstractQueuedSynchronizer框架。 在單執行緒程式中呼叫方法時,如
java 多執行緒synchronized鎖同步方法,同步程式碼塊
執行緒安全問題 同步和非同步 我們知道多個執行緒共享堆記憶體,當兩個或者多個執行緒呼叫同一個物件的方法操作物件成員時,因為cpu輪流執行執行緒,執行緒A剛開始操作物件方法,修改了資料,輪到執行緒B執行,執行緒B也操作物件方法,修改資料,可能又輪到執行緒A操作物件方法,接著上次執行緒A的剩餘部
java多執行緒--簡易使用同步鎖實現一對一交替列印
一、本例需要分析的地方不多,只需要使用一個同步鎖+一個計數器就能搞定,直接奉送原始碼吧: package com.example.liuxiaobing.statemodel.mutil_thr
Java多執行緒10:同步不具有繼承性
父類的同步操作子類是不可以繼承獲得的 package unit2; public class Demo8_tongbubujujichengxing { public static void m
Java多執行緒-BlockingQueue(阻塞佇列)
前言: BlockingQueue是多執行緒安全的佇列,它有兩種常見的阻塞場景。 佇列中沒有資料的情況下,消費者端的所有執行緒都會被自動阻塞(掛起),直到有資料放入佇列。 當佇列中填滿
java多執行緒-03-阻塞佇列簡介
宣告 該系列文章只是記錄本人回顧java多執行緒程式設計時候記錄的筆記。文中所用語言並非嚴謹的專業術語(太嚴謹的術語其實本人也不會……)。難免有理解偏差的地方,歡迎指正。 另外,大神請繞路。不喜勿噴。 畢竟好記性不如爛筆頭嘛,而且許多東西只要不是
Java多執行緒6 中同步函式的鎖和同步程式碼塊的鎖的區別
同步程式碼塊的出現是解決了多執行緒的安全問題,但是它增加了程式碼的縮排層級,同時降低了效率(每次無論是不是對的鎖,每個路徑都要去判斷) 針對同步出現的這兩個問題,首先討論第一個。因此引出一個新的知識點———————— 同步函式 關於同步函式的使用(一買車票的程式碼為例子
Java多執行緒____BlockingQueue阻塞佇列使用
package com.frame.base.thread; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; /** * 併發程式設計
多執行緒非阻塞模式例項
多執行緒非阻塞模式到現在算是告一段落吧 雖然還有一些小的bug需要修正 總結一下 準備向後面進發 實現功能: 本程式主要實現遠端計算的功能 通過非阻塞套接字和多執行緒的結合 讓通訊變得高效 伺服器通過維護一個客戶端連結串列來實現對多個客戶響應 客戶端自身驗證表示式的正確性 當輸入Byebye時 伺
python 多程序/多執行緒/協程 同步非同步
這篇主要是對概念的理解: 1、非同步和多執行緒區別:二者不是一個同等關係,非同步是最終目的,多執行緒只是我們實現非同步的一種手段。非同步是當一個呼叫請求傳送給被呼叫者,而呼叫者不用等待其結果的返回而可以做其它的事情。實現非同步可以採用多執行緒技術或則交給另外的程序來處理。多執行緒的好處,比較容易的實現了 非
java多執行緒的共享變數訪問控制例項
最近打算去一家電商公司,對於高併發的資料訪問控制有著嚴格的要求,近期打算把多執行緒的知識在好好補一下。 執行緒排程有五個狀態; 開始,可執行,執行,阻塞,死亡。 啟動執行緒有兩種方法。繼承Thread類或則實現Runnable介面,其實Thread類也實現
java多執行緒2:Thread中的例項方法
1.start() start()方法的作用講白了 就是 “執行緒規劃器”,此執行緒可以執行,正在等待CPU呼叫執行緒物件得run()方法,產生一個非同步執行的效果。 結論:CPU執行哪個執行緒的程式碼具有不確定性。 啟動的順序是 m0 m1 m2 但是輸出的結
Java多執行緒/併發05、synchronized應用例項:執行緒間操作共享資料
電商平臺中最重要的一點就是賣東西。同個商品不能無限制的賣下去的,因為商品有庫存量,超過庫存就不能賣了。 這裡,約定一個規則,下單使庫存減n,取消訂單使庫存加m。庫存數量不可以小於0。 假設平臺上同時有很多使用者在操作,在不考慮效率的情況下,我們用同步方法來模
java多執行緒11.非阻塞同步機制
關於非阻塞演算法CAS。 比較並交換CAS:CAS包含了3個運算元---需要讀寫的記憶體位置V,進行比較的值A和擬寫入的新值B。當且僅當V的值等於A時,CAS才會通過原子的方式用新值B來更新V的值,否則不會執行任何操作。無論位置V的值是否等於A,都將返回V原有的值。然後執行緒可以基於新返回的V值來做對應的操作
Java多執行緒、同步非同步及阻塞和非阻塞
1、程序和執行緒的概念 程序:執行中的應用程式稱為程序,擁有系統資源(cpu、記憶體) 執行緒:程序中的一段程式碼,一個程序中可以有多段程式碼。本身不擁有資源(共享所在程序的資源); 在java中,程式入口被自動建立為主執行緒,在主執行緒中可以建立多個子執
Java多執行緒-44-靜態和非靜態方法同步鎖物件是什麼
前面一篇,我們知道了synchronized關鍵字擴起來範圍的程式碼塊就可以實現同步,其實,在Java中,只需要在方法上加上synchronized關鍵字即可,就像加上static一樣。本篇來看看加上synchronized關鍵字修飾的非靜態和靜態方法的同步鎖物件是什麼。 1.非靜態同步鎖物
Java多執行緒程式非阻塞式鎖定實現
Java對多執行緒程式的鎖定已經有良好的支援,通常使用synchronized修飾一個方法或者一段程式碼。但是有一個問題,多個執行緒同時呼叫同一個方法的時候,所有執行緒都被排隊處理了。該被呼叫的方法越耗時,執行緒越多的時候,等待的執行緒等待的時間也就越
Java多執行緒之 執行緒安全容器的非阻塞容器
在併發程式設計中,會經常遇到使用容器。但是如果一個容器不是執行緒安全的,那麼他在多執行緒的插入或者
java多執行緒設定 執行緒超時 非阻塞實現
執行緒是屬於非同步計算模型,所以你不可能直接從別的執行緒中得到函式返回值。 這時候,Future就出場了。Futrue可以監視目標執行緒呼叫call的情況,當你呼叫Future的get()方法以獲得結果時,當前執行緒就開始阻塞,直接call方法結束返回結果。