java 生成并行 IntStream(和其他流)问题

java generated parallel IntStream(and other stream) issues

public static void main(String[] args) throws Throwable {
    AtomicInteger i = new AtomicInteger();
    IntStream
            .generate(
                    () -> {
                        int item = i.incrementAndGet();
                        System.out.println("[generator]: "
                                + Thread.currentThread().getName()
                                + ", item:" + item);
                        return item;
                    })
            .limit(5)
            .parallel()
            .forEach(
                    item -> {
                        System.out.println("[consumer]: "
                                + Thread.currentThread().getName()
                                + ", item:" + item);
                    });
}

In my mind the generator should call 5(limit) times and the consumer should executing in multiple thread,but the generator called 512 times and the consumer executing in same thread, anyone can explain me its a bug or I'm not use correct way?

outputs: [generator]: ForkJoinPool.commonPool-worker-3, item:3 [generator]: ForkJoinPool.commonPool-worker-3, item:5 [generator]: ForkJoinPool.commonPool-worker-3, item:6 [generator]: ForkJoinPool.commonPool-worker-3, item:7 [generator]: ForkJoinPool.commonPool-worker-3, item:8 [generator]: ForkJoinPool.commonPool-worker-3, item:9 [generator]: ForkJoinPool.commonPool-worker-3, item:10 [generator]: ForkJoinPool.commonPool-worker-2, item:4 [generator]: main, item:2 [generator]: ForkJoinPool.commonPool-worker-1, item:1 [generator]: main, item:13 [generator]: ForkJoinPool.commonPool-worker-2, item:12 [generator]: ForkJoinPool.commonPool-worker-3, item:11 [generator]: ForkJoinPool.commonPool-worker-2, item:16 [generator]: main, item:15 [generator]: ForkJoinPool.commonPool-worker-1, item:14 [generator]: main, item:19 [generator]: ForkJoinPool.commonPool-worker-2, item:18 [generator]: ForkJoinPool.commonPool-worker-3, item:17 [generator]: ForkJoinPool.commonPool-worker-2, item:22 [generator]: ForkJoinPool.commonPool-worker-2, item:24 [generator]: ForkJoinPool.commonPool-worker-2, item:25 [generator]: ForkJoinPool.commonPool-worker-2, item:26 [generator]: ForkJoinPool.commonPool-worker-2, item:27 [generator]: ForkJoinPool.commonPool-worker-2, item:28 [generator]: ForkJoinPool.commonPool-worker-2, item:29 [generator]: ForkJoinPool.commonPool-worker-2, item:30 [generator]: ForkJoinPool.commonPool-worker-2, item:31 [generator]: ForkJoinPool.commonPool-worker-2, item:32 [generator]: ForkJoinPool.commonPool-worker-2, item:33 [generator]: ForkJoinPool.commonPool-worker-2, item:34 [generator]: ForkJoinPool.commonPool-worker-2, item:35 [generator]: ForkJoinPool.commonPool-worker-2, item:36 [generator]: ForkJoinPool.commonPool-worker-2, item:37 [generator]: ForkJoinPool.commonPool-worker-2, item:38 [generator]: ForkJoinPool.commonPool-worker-2, item:39 [generator]: ForkJoinPool.commonPool-worker-2, item:40 [generator]: ForkJoinPool.commonPool-worker-2, item:41 [generator]: ForkJoinPool.commonPool-worker-2, item:42 [generator]: ForkJoinPool.commonPool-worker-2, item:43 [generator]: ForkJoinPool.commonPool-worker-2, item:44 [generator]: ForkJoinPool.commonPool-worker-2, item:45 [generator]: ForkJoinPool.commonPool-worker-2, item:46 [generator]: ForkJoinPool.commonPool-worker-2, item:47 [generator]: ForkJoinPool.commonPool-worker-2, item:48 [generator]: ForkJoinPool.commonPool-worker-2, item:49 [generator]: ForkJoinPool.commonPool-worker-2, item:50 [generator]: ForkJoinPool.commonPool-worker-2, item:51 [generator]: ForkJoinPool.commonPool-worker-2, item:52 [generator]: ForkJoinPool.commonPool-worker-2, item:53 [generator]: ForkJoinPool.commonPool-worker-2, item:54 [generator]: ForkJoinPool.commonPool-worker-2, item:55 [generator]: ForkJoinPool.commonPool-worker-2, item:56 [generator]: ForkJoinPool.commonPool-worker-2, item:57 [generator]: ForkJoinPool.commonPool-worker-2, item:58 [generator]: ForkJoinPool.commonPool-worker-2, item:59 [generator]: ForkJoinPool.commonPool-worker-2, item:60 [generator]: ForkJoinPool.commonPool-worker-2, item:61 [generator]: ForkJoinPool.commonPool-worker-2, item:62 [generator]: ForkJoinPool.commonPool-worker-2, item:63 [generator]: ForkJoinPool.commonPool-worker-2, item:64 [generator]: ForkJoinPool.commonPool-worker-2, item:65 [generator]: ForkJoinPool.commonPool-worker-2, item:66 [generator]: ForkJoinPool.commonPool-worker-2, item:67 [generator]: ForkJoinPool.commonPool-worker-2, item:68 [generator]: ForkJoinPool.commonPool-worker-2, item:69 [generator]: ForkJoinPool.commonPool-worker-2, item:70 [generator]: ForkJoinPool.commonPool-worker-2, item:71 [generator]: ForkJoinPool.commonPool-worker-2, item:72 [generator]: ForkJoinPool.commonPool-worker-2, item:73 [generator]: ForkJoinPool.commonPool-worker-2, item:74 [generator]: ForkJoinPool.commonPool-worker-2, item:75 [generator]: ForkJoinPool.commonPool-worker-2, item:76 [generator]: ForkJoinPool.commonPool-worker-2, item:77 [generator]: ForkJoinPool.commonPool-worker-2, item:78 [generator]: ForkJoinPool.commonPool-worker-2, item:79 [generator]: ForkJoinPool.commonPool-worker-2, item:80 [generator]: ForkJoinPool.commonPool-worker-2, item:81 [generator]: ForkJoinPool.commonPool-worker-2, item:82 [generator]: ForkJoinPool.commonPool-worker-2, item:83 [generator]: ForkJoinPool.commonPool-worker-2, item:84 [generator]: ForkJoinPool.commonPool-worker-2, item:85 [generator]: ForkJoinPool.commonPool-worker-2, item:86 [generator]: ForkJoinPool.commonPool-worker-2, item:87 [generator]: ForkJoinPool.commonPool-worker-2, item:88 [generator]: ForkJoinPool.commonPool-worker-2, item:89 [generator]: ForkJoinPool.commonPool-worker-2, item:90 [generator]: ForkJoinPool.commonPool-worker-2, item:91 [generator]: ForkJoinPool.commonPool-worker-2, item:92 [generator]: ForkJoinPool.commonPool-worker-2, item:93 [generator]: ForkJoinPool.commonPool-worker-2, item:94 [generator]: ForkJoinPool.commonPool-worker-2, item:95 [generator]: ForkJoinPool.commonPool-worker-2, item:96 [generator]: ForkJoinPool.commonPool-worker-2, item:97 [generator]: ForkJoinPool.commonPool-worker-2, item:98 [generator]: ForkJoinPool.commonPool-worker-2, item:99 [generator]: ForkJoinPool.commonPool-worker-2, item:100 [generator]: ForkJoinPool.commonPool-worker-2, item:101 [generator]: ForkJoinPool.commonPool-worker-2, item:102 [generator]: ForkJoinPool.commonPool-worker-2, item:103 [generator]: ForkJoinPool.commonPool-worker-2, item:104 [generator]: ForkJoinPool.commonPool-worker-2, item:105 [generator]: ForkJoinPool.commonPool-worker-2, item:106 [generator]: ForkJoinPool.commonPool-worker-2, item:107 [generator]: ForkJoinPool.commonPool-worker-2, item:108 [generator]: ForkJoinPool.commonPool-worker-2, item:109 [generator]: ForkJoinPool.commonPool-worker-2, item:110 [generator]: ForkJoinPool.commonPool-worker-2, item:111 [generator]: ForkJoinPool.commonPool-worker-2, item:112 [generator]: ForkJoinPool.commonPool-worker-2, item:113 [generator]: ForkJoinPool.commonPool-worker-2, item:114 [generator]: ForkJoinPool.commonPool-worker-2, item:115 [generator]: ForkJoinPool.commonPool-worker-2, item:116 [generator]: ForkJoinPool.commonPool-worker-2, item:117 [generator]: ForkJoinPool.commonPool-worker-2, item:118 [generator]: ForkJoinPool.commonPool-worker-2, item:119 [generator]: ForkJoinPool.commonPool-worker-2, item:120 [generator]: ForkJoinPool.commonPool-worker-2, item:121 [generator]: ForkJoinPool.commonPool-worker-2, item:122 [generator]: ForkJoinPool.commonPool-worker-2, item:123 [generator]: ForkJoinPool.commonPool-worker-2, item:124 [generator]: ForkJoinPool.commonPool-worker-2, item:125 [generator]: ForkJoinPool.commonPool-worker-2, item:126 [generator]: ForkJoinPool.commonPool-worker-2, item:127 [generator]: ForkJoinPool.commonPool-worker-2, item:128 [generator]: ForkJoinPool.commonPool-worker-2, item:129 [generator]: ForkJoinPool.commonPool-worker-2, item:130 [generator]: ForkJoinPool.commonPool-worker-2, item:131 [generator]: ForkJoinPool.commonPool-worker-2, item:132 [generator]: ForkJoinPool.commonPool-worker-2, item:133 [generator]: ForkJoinPool.commonPool-worker-2, item:134 [generator]: ForkJoinPool.commonPool-worker-2, item:135 [generator]: ForkJoinPool.commonPool-worker-2, item:136 [generator]: ForkJoinPool.commonPool-worker-2, item:137 [generator]: ForkJoinPool.commonPool-worker-2, item:138 [generator]: ForkJoinPool.commonPool-worker-2, item:139 [generator]: ForkJoinPool.commonPool-worker-2, item:140 [generator]: ForkJoinPool.commonPool-worker-2, item:141 [generator]: ForkJoinPool.commonPool-worker-2, item:142 [generator]: ForkJoinPool.commonPool-worker-2, item:143 [generator]: ForkJoinPool.commonPool-worker-2, item:144 [generator]: ForkJoinPool.commonPool-worker-2, item:145 [generator]: ForkJoinPool.commonPool-worker-2, item:146 [consumer]: ForkJoinPool.commonPool-worker-2, item:4 [consumer]: ForkJoinPool.commonPool-worker-2, item:12 [consumer]: ForkJoinPool.commonPool-worker-2, item:16 [consumer]: ForkJoinPool.commonPool-worker-2, item:18 [consumer]: ForkJoinPool.commonPool-worker-2, item:22 [generator]: main, item:21 [generator]: main, item:147 [generator]: main, item:148 [generator]: main, item:149 [generator]: main, item:150 [generator]: main, item:151 [generator]: main, item:152 [generator]: main, item:153 [generator]: main, item:154 [generator]: main, item:155 [generator]: main, item:156 [generator]: main, item:157 [generator]: main, item:158 [generator]: main, item:159 [generator]: main, item:160 [generator]: main, item:161 [generator]: main, item:162 [generator]: main, item:163 [generator]: main, item:164 [generator]: main, item:165 [generator]: main, item:166 [generator]: main, item:167 [generator]: main, item:168 [generator]: main, item:169 [generator]: main, item:170 [generator]: main, item:171 [generator]: main, item:172 [generator]: main, item:173 [generator]: main, item:174 [generator]: main, item:175 [generator]: main, item:176 [generator]: main, item:177 [generator]: main, item:178 [generator]: main, item:179 [generator]: main, item:180 [generator]: main, item:181 [generator]: main, item:182 [generator]: main, item:183 [generator]: main, item:184 [generator]: main, item:185 [generator]: main, item:186 [generator]: main, item:187 [generator]: main, item:188 [generator]: main, item:189 [generator]: main, item:190 [generator]: main, item:191 [generator]: main, item:192 [generator]: main, item:193 [generator]: main, item:194 [generator]: main, item:195 [generator]: main, item:196 [generator]: main, item:197 [generator]: main, item:198 [generator]: main, item:199 [generator]: main, item:200 [generator]: main, item:201 [generator]: main, item:202 [generator]: main, item:203 [generator]: main, item:204 [generator]: main, item:205 [generator]: main, item:206 [generator]: main, item:207 [generator]: main, item:208 [generator]: main, item:209 [generator]: main, item:210 [generator]: main, item:211 [generator]: main, item:212 [generator]: main, item:213 [generator]: main, item:214 [generator]: main, item:215 [generator]: main, item:216 [generator]: main, item:217 [generator]: main, item:218 [generator]: main, item:219 [generator]: main, item:220 [generator]: main, item:221 [generator]: main, item:222 [generator]: main, item:223 [generator]: main, item:224 [generator]: main, item:225 [generator]: main, item:226 [generator]: main, item:227 [generator]: main, item:228 [generator]: main, item:229 [generator]: main, item:230 [generator]: main, item:231 [generator]: main, item:232 [generator]: main, item:233 [generator]: main, item:234 [generator]: main, item:235 [generator]: main, item:236 [generator]: main, item:237 [generator]: main, item:238 [generator]: main, item:239 [generator]: main, item:240 [generator]: main, item:241 [generator]: main, item:242 [generator]: main, item:243 [generator]: main, item:244 [generator]: main, item:245 [generator]: main, item:246 [generator]: main, item:247 [generator]: main, item:248 [generator]: main, item:249 [generator]: main, item:250 [generator]: main, item:251 [generator]: main, item:252 [generator]: main, item:253 [generator]: main, item:254 [generator]: ForkJoinPool.commonPool-worker-1, item:20 [generator]: ForkJoinPool.commonPool-worker-1, item:256 [generator]: ForkJoinPool.commonPool-worker-1, item:257 [generator]: ForkJoinPool.commonPool-worker-1, item:258 [generator]: ForkJoinPool.commonPool-worker-1, item:259 [generator]: ForkJoinPool.commonPool-worker-1, item:260 [generator]: ForkJoinPool.commonPool-worker-1, item:261 [generator]: ForkJoinPool.commonPool-worker-1, item:262 [generator]: ForkJoinPool.commonPool-worker-1, item:263 [generator]: ForkJoinPool.commonPool-worker-1, item:264 [generator]: ForkJoinPool.commonPool-worker-1, item:265 [generator]: ForkJoinPool.commonPool-worker-1, item:266 [generator]: ForkJoinPool.commonPool-worker-1, item:267 [generator]: ForkJoinPool.commonPool-worker-1, item:268 [generator]: ForkJoinPool.commonPool-worker-1, item:269 [generator]: ForkJoinPool.commonPool-worker-1, item:270 [generator]: ForkJoinPool.commonPool-worker-1, item:271 [generator]: ForkJoinPool.commonPool-worker-1, item:272 [generator]: ForkJoinPool.commonPool-worker-1, item:273 [generator]: ForkJoinPool.commonPool-worker-1, item:274 [generator]: ForkJoinPool.commonPool-worker-1, item:275 [generator]: ForkJoinPool.commonPool-worker-1, item:276 [generator]: ForkJoinPool.commonPool-worker-1, item:277 [generator]: ForkJoinPool.commonPool-worker-1, item:278 [generator]: ForkJoinPool.commonPool-worker-1, item:279 [generator]: ForkJoinPool.commonPool-worker-1, item:280 [generator]: ForkJoinPool.commonPool-worker-1, item:281 [generator]: ForkJoinPool.commonPool-worker-1, item:282 [generator]: ForkJoinPool.commonPool-worker-1, item:283 [generator]: ForkJoinPool.commonPool-worker-1, item:284 [generator]: ForkJoinPool.commonPool-worker-1, item:285 [generator]: ForkJoinPool.commonPool-worker-1, item:286 [generator]: ForkJoinPool.commonPool-worker-1, item:287 [generator]: ForkJoinPool.commonPool-worker-1, item:288 [generator]: ForkJoinPool.commonPool-worker-1, item:289 [generator]: ForkJoinPool.commonPool-worker-1, item:290 [generator]: ForkJoinPool.commonPool-worker-1, item:291 [generator]: ForkJoinPool.commonPool-worker-1, item:292 [generator]: ForkJoinPool.commonPool-worker-1, item:293 [generator]: ForkJoinPool.commonPool-worker-1, item:294 [generator]: ForkJoinPool.commonPool-worker-1, item:295 [generator]: ForkJoinPool.commonPool-worker-1, item:296 [generator]: ForkJoinPool.commonPool-worker-1, item:297 [generator]: ForkJoinPool.commonPool-worker-1, item:298 [generator]: ForkJoinPool.commonPool-worker-1, item:299 [generator]: ForkJoinPool.commonPool-worker-1, item:300 [generator]: ForkJoinPool.commonPool-worker-1, item:301 [generator]: ForkJoinPool.commonPool-worker-1, item:302 [generator]: ForkJoinPool.commonPool-worker-1, item:303 [generator]: ForkJoinPool.commonPool-worker-1, item:304 [generator]: ForkJoinPool.commonPool-worker-1, item:305 [generator]: ForkJoinPool.commonPool-worker-1, item:306 [generator]: ForkJoinPool.commonPool-worker-1, item:307 [generator]: ForkJoinPool.commonPool-worker-1, item:308 [generator]: ForkJoinPool.commonPool-worker-1, item:309 [generator]: ForkJoinPool.commonPool-worker-1, item:310 [generator]: ForkJoinPool.commonPool-worker-1, item:311 [generator]: ForkJoinPool.commonPool-worker-1, item:312 [generator]: ForkJoinPool.commonPool-worker-1, item:313 [generator]: ForkJoinPool.commonPool-worker-1, item:314 [generator]: ForkJoinPool.commonPool-worker-1, item:315 [generator]: ForkJoinPool.commonPool-worker-1, item:316 [generator]: ForkJoinPool.commonPool-worker-1, item:317 [generator]: ForkJoinPool.commonPool-worker-1, item:318 [generator]: ForkJoinPool.commonPool-worker-1, item:319 [generator]: ForkJoinPool.commonPool-worker-1, item:320 [generator]: ForkJoinPool.commonPool-worker-1, item:321 [generator]: ForkJoinPool.commonPool-worker-1, item:322 [generator]: ForkJoinPool.commonPool-worker-1, item:323 [generator]: ForkJoinPool.commonPool-worker-1, item:324 [generator]: ForkJoinPool.commonPool-worker-1, item:325 [generator]: ForkJoinPool.commonPool-worker-1, item:326 [generator]: ForkJoinPool.commonPool-worker-1, item:327 [generator]: ForkJoinPool.commonPool-worker-1, item:328 [generator]: ForkJoinPool.commonPool-worker-1, item:329 [generator]: ForkJoinPool.commonPool-worker-1, item:330 [generator]: ForkJoinPool.commonPool-worker-1, item:331 [generator]: ForkJoinPool.commonPool-worker-1, item:332 [generator]: ForkJoinPool.commonPool-worker-1, item:333 [generator]: ForkJoinPool.commonPool-worker-1, item:334 [generator]: ForkJoinPool.commonPool-worker-1, item:335 [generator]: ForkJoinPool.commonPool-worker-1, item:336 [generator]: ForkJoinPool.commonPool-worker-1, item:337 [generator]: ForkJoinPool.commonPool-worker-1, item:338 [generator]: ForkJoinPool.commonPool-worker-1, item:339 [generator]: ForkJoinPool.commonPool-worker-1, item:340 [generator]: ForkJoinPool.commonPool-worker-1, item:341 [generator]: ForkJoinPool.commonPool-worker-1, item:342 [generator]: ForkJoinPool.commonPool-worker-1, item:343 [generator]: ForkJoinPool.commonPool-worker-1, item:344 [generator]: ForkJoinPool.commonPool-worker-1, item:345 [generator]: ForkJoinPool.commonPool-worker-1, item:346 [generator]: ForkJoinPool.commonPool-worker-1, item:347 [generator]: main, item:255 [generator]: main, item:349 [generator]: main, item:350 [generator]: main, item:351 [generator]: main, item:352 [generator]: main, item:353 [generator]: main, item:354 [generator]: main, item:355 [generator]: main, item:356 [generator]: ForkJoinPool.commonPool-worker-3, item:23 [generator]: main, item:357 [generator]: main, item:359 [generator]: main, item:360 [generator]: ForkJoinPool.commonPool-worker-1, item:348 [generator]: ForkJoinPool.commonPool-worker-1, item:362 [generator]: ForkJoinPool.commonPool-worker-1, item:363 [generator]: ForkJoinPool.commonPool-worker-1, item:364 [generator]: ForkJoinPool.commonPool-worker-1, item:365 [generator]: ForkJoinPool.commonPool-worker-1, item:366 [generator]: ForkJoinPool.commonPool-worker-1, item:367 [generator]: ForkJoinPool.commonPool-worker-1, item:368 [generator]: ForkJoinPool.commonPool-worker-1, item:369 [generator]: ForkJoinPool.commonPool-worker-1, item:370 [generator]: ForkJoinPool.commonPool-worker-1, item:371 [generator]: ForkJoinPool.commonPool-worker-1, item:372 [generator]: ForkJoinPool.commonPool-worker-1, item:373 [generator]: ForkJoinPool.commonPool-worker-1, item:374 [generator]: ForkJoinPool.commonPool-worker-1, item:375 [generator]: ForkJoinPool.commonPool-worker-1, item:376 [generator]: ForkJoinPool.commonPool-worker-1, item:377 [generator]: ForkJoinPool.commonPool-worker-1, item:378 [generator]: ForkJoinPool.commonPool-worker-1, item:379 [generator]: ForkJoinPool.commonPool-worker-1, item:380 [generator]: ForkJoinPool.commonPool-worker-1, item:381 [generator]: ForkJoinPool.commonPool-worker-1, item:382 [generator]: ForkJoinPool.commonPool-worker-1, item:383 [generator]: ForkJoinPool.commonPool-worker-1, item:384 [generator]: ForkJoinPool.commonPool-worker-1, item:385 [generator]: ForkJoinPool.commonPool-worker-1, item:386 [generator]: ForkJoinPool.commonPool-worker-1, item:387 [generator]: ForkJoinPool.commonPool-worker-1, item:388 [generator]: ForkJoinPool.commonPool-worker-1, item:389 [generator]: ForkJoinPool.commonPool-worker-1, item:390 [generator]: ForkJoinPool.commonPool-worker-1, item:391 [generator]: ForkJoinPool.commonPool-worker-1, item:392 [generator]: ForkJoinPool.commonPool-worker-1, item:393 [generator]: main, item:361 [generator]: main, item:394 [generator]: main, item:395 [generator]: ForkJoinPool.commonPool-worker-3, item:358 [generator]: ForkJoinPool.commonPool-worker-3, item:396 [generator]: ForkJoinPool.commonPool-worker-3, item:397 [generator]: ForkJoinPool.commonPool-worker-3, item:398 [generator]: ForkJoinPool.commonPool-worker-3, item:399 [generator]: ForkJoinPool.commonPool-worker-3, item:400 [generator]: ForkJoinPool.commonPool-worker-3, item:401 [generator]: ForkJoinPool.commonPool-worker-3, item:402 [generator]: ForkJoinPool.commonPool-worker-3, item:403 [generator]: ForkJoinPool.commonPool-worker-3, item:404 [generator]: ForkJoinPool.commonPool-worker-3, item:405 [generator]: ForkJoinPool.commonPool-worker-3, item:406 [generator]: ForkJoinPool.commonPool-worker-3, item:407 [generator]: ForkJoinPool.commonPool-worker-3, item:408 [generator]: ForkJoinPool.commonPool-worker-3, item:409 [generator]: ForkJoinPool.commonPool-worker-3, item:410 [generator]: ForkJoinPool.commonPool-worker-3, item:411 [generator]: ForkJoinPool.commonPool-worker-3, item:412 [generator]: ForkJoinPool.commonPool-worker-3, item:413 [generator]: ForkJoinPool.commonPool-worker-3, item:414 [generator]: ForkJoinPool.commonPool-worker-3, item:415 [generator]: ForkJoinPool.commonPool-worker-3, item:416 [generator]: ForkJoinPool.commonPool-worker-3, item:417 [generator]: ForkJoinPool.commonPool-worker-3, item:418 [generator]: ForkJoinPool.commonPool-worker-3, item:419 [generator]: ForkJoinPool.commonPool-worker-3, item:420 [generator]: ForkJoinPool.commonPool-worker-3, item:421 [generator]: ForkJoinPool.commonPool-worker-3, item:422 [generator]: ForkJoinPool.commonPool-worker-3, item:423 [generator]: ForkJoinPool.commonPool-worker-3, item:424 [generator]: ForkJoinPool.commonPool-worker-3, item:425 [generator]: ForkJoinPool.commonPool-worker-3, item:426 [generator]: ForkJoinPool.commonPool-worker-3, item:427 [generator]: ForkJoinPool.commonPool-worker-3, item:428 [generator]: ForkJoinPool.commonPool-worker-3, item:429 [generator]: ForkJoinPool.commonPool-worker-3, item:430 [generator]: ForkJoinPool.commonPool-worker-3, item:431 [generator]: ForkJoinPool.commonPool-worker-3, item:432 [generator]: ForkJoinPool.commonPool-worker-3, item:433 [generator]: ForkJoinPool.commonPool-worker-3, item:434 [generator]: ForkJoinPool.commonPool-worker-3, item:435 [generator]: ForkJoinPool.commonPool-worker-3, item:436 [generator]: ForkJoinPool.commonPool-worker-3, item:437 [generator]: ForkJoinPool.commonPool-worker-3, item:438 [generator]: ForkJoinPool.commonPool-worker-3, item:439 [generator]: ForkJoinPool.commonPool-worker-3, item:440 [generator]: ForkJoinPool.commonPool-worker-3, item:441 [generator]: ForkJoinPool.commonPool-worker-3, item:442 [generator]: ForkJoinPool.commonPool-worker-3, item:443 [generator]: ForkJoinPool.commonPool-worker-3, item:444 [generator]: ForkJoinPool.commonPool-worker-3, item:445 [generator]: ForkJoinPool.commonPool-worker-3, item:446 [generator]: ForkJoinPool.commonPool-worker-3, item:447 [generator]: ForkJoinPool.commonPool-worker-3, item:448 [generator]: ForkJoinPool.commonPool-worker-3, item:449 [generator]: ForkJoinPool.commonPool-worker-3, item:450 [generator]: ForkJoinPool.commonPool-worker-3, item:451 [generator]: ForkJoinPool.commonPool-worker-3, item:452 [generator]: ForkJoinPool.commonPool-worker-3, item:453 [generator]: ForkJoinPool.commonPool-worker-3, item:454 [generator]: ForkJoinPool.commonPool-worker-3, item:455 [generator]: ForkJoinPool.commonPool-worker-3, item:456 [generator]: ForkJoinPool.commonPool-worker-3, item:457 [generator]: ForkJoinPool.commonPool-worker-3, item:458 [generator]: ForkJoinPool.commonPool-worker-3, item:459 [generator]: ForkJoinPool.commonPool-worker-3, item:460 [generator]: ForkJoinPool.commonPool-worker-3, item:461 [generator]: ForkJoinPool.commonPool-worker-3, item:462 [generator]: ForkJoinPool.commonPool-worker-3, item:463 [generator]: ForkJoinPool.commonPool-worker-3, item:464 [generator]: ForkJoinPool.commonPool-worker-3, item:465 [generator]: ForkJoinPool.commonPool-worker-3, item:466 [generator]: ForkJoinPool.commonPool-worker-3, item:467 [generator]: ForkJoinPool.commonPool-worker-3, item:468 [generator]: ForkJoinPool.commonPool-worker-3, item:469 [generator]: ForkJoinPool.commonPool-worker-3, item:470 [generator]: ForkJoinPool.commonPool-worker-3, item:471 [generator]: ForkJoinPool.commonPool-worker-3, item:472 [generator]: ForkJoinPool.commonPool-worker-3, item:473 [generator]: ForkJoinPool.commonPool-worker-3, item:474 [generator]: ForkJoinPool.commonPool-worker-3, item:475 [generator]: ForkJoinPool.commonPool-worker-3, item:476 [generator]: ForkJoinPool.commonPool-worker-3, item:477 [generator]: ForkJoinPool.commonPool-worker-3, item:478 [generator]: ForkJoinPool.commonPool-worker-3, item:479 [generator]: ForkJoinPool.commonPool-worker-3, item:480 [generator]: ForkJoinPool.commonPool-worker-3, item:481 [generator]: ForkJoinPool.commonPool-worker-3, item:482 [generator]: ForkJoinPool.commonPool-worker-3, item:483 [generator]: ForkJoinPool.commonPool-worker-3, item:484 [generator]: ForkJoinPool.commonPool-worker-3, item:485 [generator]: ForkJoinPool.commonPool-worker-3, item:486 [generator]: ForkJoinPool.commonPool-worker-3, item:487 [generator]: ForkJoinPool.commonPool-worker-3, item:488 [generator]: ForkJoinPool.commonPool-worker-3, item:489 [generator]: ForkJoinPool.commonPool-worker-3, item:490 [generator]: ForkJoinPool.commonPool-worker-3, item:491 [generator]: ForkJoinPool.commonPool-worker-3, item:492 [generator]: ForkJoinPool.commonPool-worker-3, item:493 [generator]: ForkJoinPool.commonPool-worker-3, item:494 [generator]: ForkJoinPool.commonPool-worker-3, item:495 [generator]: ForkJoinPool.commonPool-worker-3, item:496 [generator]: ForkJoinPool.commonPool-worker-3, item:497 [generator]: ForkJoinPool.commonPool-worker-3, item:498 [generator]: ForkJoinPool.commonPool-worker-3, item:499 [generator]: ForkJoinPool.commonPool-worker-3, item:500 [generator]: ForkJoinPool.commonPool-worker-3, item:501 [generator]: ForkJoinPool.commonPool-worker-3, item:502 [generator]: ForkJoinPool.commonPool-worker-3, item:503 [generator]: ForkJoinPool.commonPool-worker-3, item:504 [generator]: ForkJoinPool.commonPool-worker-3, item:505 [generator]: ForkJoinPool.commonPool-worker-3, item:506 [generator]: ForkJoinPool.commonPool-worker-3, item:507 [generator]: ForkJoinPool.commonPool-worker-3, item:508 [generator]: ForkJoinPool.commonPool-worker-3, item:509 [generator]: ForkJoinPool.commonPool-worker-3, item:510 [generator]: ForkJoinPool.commonPool-worker-3, item:511 [generator]: ForkJoinPool.commonPool-worker-3, item:512

只是胡乱猜测,因为我对技术细节不是很熟悉:

有一个线程池。如果有工作要做并且有可用的空闲线程,则可能会重新使用它。 Generator 和 Consumer 可以使用相同的线程,但它们是独立发生的。

由于 Instream-javadocs 状态 IntStream.generate 似乎是 Return[..] 无限顺序无序流 ,不管那是什么意思。我想它只是停止生成值,因为垃圾收集器轮次检测到没有人对结果感兴趣。

也许 IntStream.range(0, 5) 就是您要找的。这也消除了对原子整数和函数副作用的需要。

多次执行您的代码后,这是我观察到的结果:

  • i.incrementAndGet() 执行随机次数。这里有一些计数:384、256、128、768、640、896、1024。但是这个方法被调用的次数总是能被8整除。涉及到8个线程。
  • forEach 总是随机选择一个线程(它可以是主线程或另一个 ForkJoin 池线程)并打印它的项目。无论做什么,都是有序的。

我认为 API 的行为是正确的,因为 IntStream.generate 更适合生成随机数,而这正是它所做的。它的 Javadoc 描述是:

Returns an infinite sequential unordered stream where each element is generated by the provided {@code IntSupplier}. This is suitable for generating constant streams, streams of random elements, etc.

这是我用来检查行为的测试:

IntStream.range(0, 20).forEach(c -> {
    AtomicInteger i = new AtomicInteger();
    IntStream
            .generate(
                    () -> {
                        int item = i.incrementAndGet();
//                            System.out.println("[generator]: "
//                                    + Thread.currentThread().getName()
//                                    + ", item:" + item);
                        return item;
                    })
            .limit(5)
            .parallel()
            .forEach(
                    item -> {
                        System.out.println("[consumer]: "
                                + Thread.currentThread().getName()
                                + ", item:" + item);
                    });
    System.out.println(i);
    System.out.println(i.intValue() % 8);
});

我的建议是多次 运行 您的代码,以便更好地了解正在发生的事情。生成器被调用 512 次并不完全正确。

Thanks all, I checked in java 10.0.1: 1. The code will works in multiple threads(so java 8 should a bug work in single thread, and fixed in 10.0.1) 2. generator called 9 times(test in Intellj, its random), it's because have multiple threads fetch the items, and another thread to processing, and the fetch data threads not do the limit

[generator]: main, item:1 [generator]: ForkJoinPool.commonPool-worker-2, item:3 [consumer]: main, item:1 [generator]: ForkJoinPool.commonPool-worker-4, item:2 [generator]: ForkJoinPool.commonPool-worker-13, item:6 [generator]: main, item:5 [generator]: ForkJoinPool.commonPool-worker-11, item:4 [consumer]: ForkJoinPool.commonPool-worker-2, item:3 [consumer]: main, item:5 [generator]: ForkJoinPool.commonPool-worker-6, item:9 [consumer]: ForkJoinPool.commonPool-worker-13, item:6 [generator]: ForkJoinPool.commonPool-worker-15, item:8 [consumer]: ForkJoinPool.commonPool-worker-4, item:2 [generator]: ForkJoinPool.commonPool-worker-9, item:7

这是一个很好的问题,但不知何故解释得很糟糕。让我们简化一下:

    AtomicInteger i = new AtomicInteger(0);
    AtomicInteger count = new AtomicInteger(0);
    IntStream.generate(() -> i.incrementAndGet())
            .parallel()
            .peek(x -> count.incrementAndGet())
            .limit(5)
            .forEach(System.out::println);

    System.out.println("count = " + count);

运行 在 java-8 中,确实在我的机器上打印了 512(经常),但关键是因为你使用的是 无序流通过generatelimit可以随意取用part/values;因此,当您说在您看来生成器应该只被调用 5 次时,这是错误的。它被称为流实现感觉的任意次数。

与此同时,java-10 确实运行生成器 (Supplier) 的次数少了很多(不是 总是 5),所以可能内部发生了变化,以更快地使操作短路或取消已经启动的任务。