我一直在尋找類似的問題,但對於我的要求,我想我需要一些特殊的東西,我會詳細解釋它。如何爲Java併發應用程序制定優化方案?
首先我需要遷移其使用這種方式工作的系統:
- 稱爲ServerPool(線程)類與主類初始化。
- 這ServerPool創建隊列來接收插座和一個矢量來管理工作者線程(S.
所以在游泳池的代碼,我有以下幾點:
public class ServerPool extends Thread {
private LinkedBlockingQueue<SearchQuery> workQueue; //SearchQuery is a Class I defined which can handle two type of processes (for sockets and for single Strings)
private Vector<SearchThread> workers;
private final int NTHREADS = 10;
private int typeOfQuery;
public ServerPool() {
workers = new Vector<SearchThread>(NUM_THREAD);
workQueue = new LinkedBlockingQueue<SearchQuery>();
this.typeOfQuery = typeOfQuery;
SearchThread search = new SearchThread(workQueue);
search.start();
workers.add(search);
}
public void run() {
while(true){
SearchQuery client = null;
if (typeOfQuery == 1) {
client = new SocketQuery(....);
} else if (typeOfQuery == 2) {
client = new StringQuery(...);
}
workQueue.put(client);
}
}
對於執行該SearchThread過程:
public class SearchThread extends Thread {
private LinkedBlockingQueue<SearchQuery> workQueue = null;
private SearchQuery request = null;
public SearchThread(LinkedBlockingQueue<SearchQuery> workSource) {
workQueue = workSource;
}
public void run() {
request = workQueue.take();
//Here I process the request
//And use a PrintWriter to give a "response"
}
}
這曾經使用帶有插座telnet來工作,但現在我已經被要求將其轉換成Web服務,從而爲Web服務是應該返回一個值,所以我想利用可贖回,未來和線程池的,但我不能複製完全一樣的行爲,我試圖實現這一點:
public class NewServerPool {
private final int NTHREADS = 10;
private ExecutorService executor;
private LinkedBlockingQueue<SearchQuery> workQueue;
private Vector<Future<String>> futures;
private boolean end = true;
public NewServerPool(int port, SearchQuery typeOfQuery) {
executor = Executors.newFixedThreadPool(NTHREADS);
workQueue = new LinkedBlockingQueue<SearchQuery>();
futures = new Vector<Future<String>>();
}
}
而對於搜索線程,現在它是一個Callable
public class NewSearchThread implements Callable<String>{
private SearchQuery searchQuery;
public NewSearchThread(SearchQuery searchQuery) {
this.searchQuery = searchQuery;
}
@Override
public String call() throws Exception {
String xmlResponse = null;
if (searchQuery == null) {
throw new InvalidSearchQueryException("The search query is not valid or has null value: " + searchQuery);
}
if (searchQuery instanceof SocketTimed) {
System.out.println("It is socket timed query type");
} else if (searchQuery instanceof WebServiceQuery) {
System.out.println("It is a web service query type");
}
xmlResponse = searchQuery.manageResponse();
return xmlResponse;
}
所以我得在服務器池中stucked,asumming我的WebService將調用服務器池(NewServerPool)在這種情況下的一個新實例,我怎麼能繼續嗎?如果有人能幫助我,我會很感激。 在此先感謝,最好的問候。
與舊版本是工作線程操縱套接字還是被方法調用包裝? – BevynQ 2013-05-09 21:52:57
工作線程操縱套接字。他遲遲沒有迴應。 – 2013-05-10 12:20:06