亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4248 | 回復(fù): 17
打印 上一主題 下一主題

Java虛擬機(jī)并發(fā)編程中運(yùn)算結(jié)果不確定問題 [復(fù)制鏈接]

論壇徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大;照
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大;照
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大;照
日期:2013-05-20 10:46:25CU大;照
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大;照
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大;照
日期:2013-04-17 11:19:32CU大;照
日期:2013-04-17 11:19:28
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-07-18 10:56 |只看該作者 |倒序?yàn)g覽
@duanjigang @send_linux
@hbsycw @redcap0 @zavakid @gnah


Java虛擬機(jī)編程技術(shù)大家談---多核和并發(fā)編程
我在這個(gè)活動(dòng)中獲得了《Java虛擬機(jī)并發(fā)編程 》圖書1本.看了一下,照著書上的例子作了一下,發(fā)現(xiàn)了一個(gè)問題.

在書第18頁的那個(gè)關(guān)于線程池的例子,我在原例子上略作了一些改動(dòng),并沒有影響到核心問題,但是每次運(yùn)行的結(jié)果都是不確定的

以下是我的測(cè)試代碼

這個(gè)類是從服務(wù)器獲取數(shù)據(jù)文件,例子中的網(wǎng)址是雅虎財(cái)經(jīng)的,我現(xiàn)在打開那個(gè)連接已經(jīng)無效了,因此使用本地的Nginx提供文件
  1. package com.fangzhaoguo.finance;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.MalformedURLException;
  6. import java.net.URL;

  7. public class YahooFinance {

  8.         final static int ID = 0;
  9.         final static int Name = 1;

  10.         private URL url;
  11.         private BufferedReader reader;

  12.         public YahooFinance(final String host) {
  13.                 try {
  14.                         url = new URL(host);
  15.                         reader = new BufferedReader(new InputStreamReader(url.openStream()));
  16.                 } catch (MalformedURLException e) {
  17.                         e.printStackTrace();
  18.                 } catch (IOException e) {
  19.                         e.printStackTrace();
  20.                 }
  21.         }

  22.         public double getPrice(final String ticker, int way) {
  23.                 String data = null;
  24.                 String[] dataItem;
  25.                 double lastPrice = 0;

  26.                 try {
  27.                         while (null != (data = reader.readLine())) {
  28.                                 dataItem = data.split(",");
  29.                                 if (ticker.equals(dataItem[way])) {
  30.                                         lastPrice = Double.valueOf(dataItem[dataItem.length - 1]);
  31.                                         break;
  32.                                 }
  33.                         }
  34.                 } catch (IOException e) {
  35.                         e.printStackTrace();
  36.                 }
  37.                 return lastPrice;
  38.         }

  39.         public void close() {
  40.                 try {
  41.                         reader.close();
  42.                 } catch (IOException e) {
  43.                         e.printStackTrace();
  44.                 }
  45.         }
  46. }
復(fù)制代碼
這個(gè)類就是自己建立線程池來處理并發(fā)的請(qǐng)求,以前不是并發(fā)的時(shí)候完全沒有問題,改成并發(fā)之后,每次運(yùn)行的結(jié)果都不一樣
  1. package com.fangzhaoguo.finance;

  2. import java.io.BufferedReader;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.concurrent.Callable;
  11. import java.util.concurrent.ExecutionException;
  12. import java.util.concurrent.ExecutorService;
  13. import java.util.concurrent.Executors;
  14. import java.util.concurrent.Future;
  15. import java.util.concurrent.TimeUnit;

  16. public class YahooFinanceNAV {

  17.         String host, filename;
  18.         YahooFinance finance;
  19.         Map<String, Integer> stocks;

  20.         public YahooFinanceNAV(String host, String filename) {
  21.                 this.host = host;
  22.                 this.filename = filename;
  23.                 finance = new YahooFinance(host);
  24.                 stocks = new HashMap<String, Integer>();
  25.         }

  26.         public void readTickers() {
  27.                 try {
  28.                         final BufferedReader reader = new BufferedReader(new FileReader(
  29.                                         filename));
  30.                         String info = null;
  31.                         String[] infoItem;
  32.                         while (null != (info = reader.readLine())) {
  33.                                 infoItem = info.split(",");
  34.                                 stocks.put(infoItem[0], Integer.valueOf(infoItem[1]));
  35.                         }
  36.                         reader.close();
  37.                 } catch (FileNotFoundException e) {
  38.                         e.printStackTrace();
  39.                 } catch (IOException e) {
  40.                         e.printStackTrace();
  41.                 }
  42.         }

  43.         private int getPoolSize() {
  44.                 return 4 + stocks.size() / Runtime.getRuntime().availableProcessors();
  45.         }

  46.         public double computeNAV() {
  47.                 double NAV = 0.0;
  48.                 int poolSize = getPoolSize();
  49.                 List<Callable<Double>> partitions = new ArrayList<Callable<Double>>();
  50.                 for (final String ticker : stocks.keySet()) {
  51.                         partitions.add(new Callable<Double>() {
  52.                                 public Double call() throws Exception {
  53.                                         return stocks.get(ticker)
  54.                                                         * finance.getPrice(ticker, YahooFinance.ID);
  55.                                 }
  56.                         });
  57.                 }

  58.                 ExecutorService executorService = Executors
  59.                                 .newFixedThreadPool(poolSize);
  60.                 try {
  61.                         List<Future<Double>> valFutures = executorService.invokeAll(
  62.                                         partitions, 10000, TimeUnit.SECONDS);
  63.                         for (final Future<Double> vaFuture : valFutures) {
  64.                                 NAV += vaFuture.get();
  65.                         }
  66.                 } catch (InterruptedException e) {
  67.                         e.printStackTrace();
  68.                 } catch (ExecutionException e) {
  69.                         e.printStackTrace();
  70.                 }
  71.                 executorService.shutdown();
  72.                 finance.close();
  73.                 return NAV;
  74.         }
  75. }
復(fù)制代碼
  1. package com.fangzhaoguo.finance;

  2. public class Main {

  3.         public static void main(String[] args) {
  4.                 YahooFinanceNAV yahooFinanceNAV = new YahooFinanceNAV(
  5.                                 "http://localhost/table.csv", "stocks.dat");
  6.                 yahooFinanceNAV.readTickers();
  7.                 System.out.println(yahooFinanceNAV.computeNAV());
  8.         }
  9. }
復(fù)制代碼

論壇徽章:
6
CU大牛徽章
日期:2013-05-20 10:43:41IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-07-29 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-27 06:20:00CU大;照
日期:2013-05-20 10:44:16CU大牛徽章
日期:2013-05-20 10:44:0615-16賽季CBA聯(lián)賽之廣東
日期:2018-03-09 11:17:08
2 [報(bào)告]
發(fā)表于 2013-07-18 11:53 |只看該作者
看看這樣行不行?  
for (final Future<Double> vaFuture : valFutures) {
      if(vaFuture.isDone()) {
            NAV += vaFuture.get();
       }
}

論壇徽章:
19
CU大;照
日期:2013-03-13 15:32:35CU大;照
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大;照
日期:2013-05-20 10:46:38CU大;照
日期:2013-05-20 10:46:31CU大;照
日期:2013-05-20 10:46:25CU大;照
日期:2013-05-20 10:46:18CU大;照
日期:2013-04-17 11:19:51CU大;照
日期:2013-04-17 11:19:42CU大;照
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大;照
日期:2013-04-17 11:19:28
3 [報(bào)告]
發(fā)表于 2013-07-18 12:01 |只看該作者
craaazy123 發(fā)表于 2013-07-18 11:53
看看這樣行不行?  
for (final Future vaFuture : valFutures) {
      if(vaFuture.isDone()) {


額,謝謝你

論壇徽章:
4
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34獅子座
日期:2014-02-10 17:22:57技術(shù)圖書徽章
日期:2014-02-18 08:44:12技術(shù)圖書徽章
日期:2014-04-29 14:15:42
4 [報(bào)告]
發(fā)表于 2013-07-18 12:58 |只看該作者
這不是線程安全的問題,而是線程執(zhí)行順序不確定

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2013-07-18 14:57 |只看該作者
這樣的場(chǎng)景,推薦使用 CompletionService ,然后用 take 來獲得 future,這樣可以最快拿到結(jié)果。

論壇徽章:
19
CU大;照
日期:2013-03-13 15:32:35CU大;照
日期:2013-09-18 15:15:15CU大;照
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大;照
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大;照
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大;照
日期:2013-04-17 11:19:37CU大;照
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
6 [報(bào)告]
發(fā)表于 2013-07-18 22:55 |只看該作者
craaazy123 發(fā)表于 2013-07-18 11:53
看看這樣行不行?  
for (final Future vaFuture : valFutures) {
      if(vaFuture.isDone()) {


我試了不可以

但是在另外一個(gè)例子中同樣的方法是成功的.感覺這個(gè)問題是由于IO速度慢造成的,不過我是本機(jī)測(cè)試都這樣,如果換成是直接從網(wǎng)上獲取數(shù)據(jù)那不更慢

論壇徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大;照
日期:2013-09-18 15:15:15CU大;照
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大;照
日期:2013-05-20 10:46:31CU大;照
日期:2013-05-20 10:46:25CU大;照
日期:2013-05-20 10:46:18CU大;照
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大;照
日期:2013-04-17 11:19:37CU大;照
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
7 [報(bào)告]
發(fā)表于 2013-07-18 22:57 |只看該作者
gnah 發(fā)表于 2013-07-18 12:58
這不是線程安全的問題,而是線程執(zhí)行順序不確定


最后的數(shù)據(jù)結(jié)果不一致,應(yīng)該是由數(shù)據(jù)丟失了,我做了一個(gè)沒有磁盤IO的例子,不存在這個(gè)問題
我試一下用虛擬磁盤吧

論壇徽章:
19
CU大;照
日期:2013-03-13 15:32:35CU大;照
日期:2013-09-18 15:15:15CU大;照
日期:2013-05-20 10:46:44CU大;照
日期:2013-05-20 10:46:38CU大;照
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大;照
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大;照
日期:2013-04-17 11:19:42CU大;照
日期:2013-04-17 11:19:37CU大;照
日期:2013-04-17 11:19:32CU大;照
日期:2013-04-17 11:19:28
8 [報(bào)告]
發(fā)表于 2013-07-18 23:08 |只看該作者


這是用虛擬盤軟件制作了一個(gè)虛擬磁盤,盤符是F:


將所有的文件都放在虛擬盤中,運(yùn)算結(jié)果還是不一致


論壇徽章:
19
CU大;照
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大;照
日期:2013-05-20 10:46:44CU大;照
日期:2013-05-20 10:46:38CU大;照
日期:2013-05-20 10:46:31CU大;照
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大;照
日期:2013-04-17 11:19:51CU大;照
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大;照
日期:2013-04-17 11:19:32CU大;照
日期:2013-04-17 11:19:28
9 [報(bào)告]
發(fā)表于 2013-07-18 23:09 |只看該作者
試一下樓上建議的CompletionService吧
感覺這個(gè)問題很怪異,我試了另外一個(gè)例子完全沒有問題,是個(gè)算素?cái)?shù)的,沒有磁盤IO操作,是運(yùn)算密集型的例子

論壇徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大;照
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大;照
日期:2013-05-20 10:46:25CU大;照
日期:2013-05-20 10:46:18CU大;照
日期:2013-04-17 11:19:51CU大;照
日期:2013-04-17 11:19:42CU大;照
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大;照
日期:2013-04-17 11:19:28
10 [報(bào)告]
發(fā)表于 2013-07-18 23:40 |只看該作者
回復(fù) 5# zavakid
  1. public double computeNAV() {
  2.                 double NAV = 0.0;
  3.                 int poolSize = getPoolSize();
  4.                 ExecutorService executorService = Executors
  5.                                 .newFixedThreadPool(poolSize);
  6.                 CompletionService<Double> completionService = new ExecutorCompletionService<Double>(
  7.                                 executorService);
  8.                 for (final String ticker : stocks.keySet()) {
  9.                         completionService.submit(new Callable<Double>() {
  10.                                 public Double call() throws Exception {
  11.                                         return stocks.get(ticker)
  12.                                                         * finance.getPrice(ticker, YahooFinance.ID);
  13.                                 }
  14.                         });
  15.                 }
  16.                 for (int i = 0; i < stocks.size(); i++) {
  17.                         try {
  18.                                 NAV += completionService.take().get();
  19.                         } catch (InterruptedException | ExecutionException e) {
  20.                                 e.printStackTrace();
  21.                         }
  22.                 }
  23.                 executorService.shutdown();
  24.                 finance.close();
  25.                 return NAV;
  26.         }
復(fù)制代碼
我從網(wǎng)上看了一個(gè)例子,是這么個(gè)用法,可是運(yùn)行起來還是老毛病,結(jié)果總是老變
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP