1
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

Stefan Zobel
  • 3,182
  • 7
  • 28
  • 38
Max
  • 21
  • 3

4 Answers4

2

This is a good question, but somehow very bad explained. Let's simplify this:

    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);

Running in java-8, indeed sort of prints 512 on my machine (quite constantly), but the point is that since you are using an unordered stream via generate, limit is free to take whatever part/values it wants; so when you say that in your mind the generator is suppose to be called 5 times only is wrong. It is called any number of times the stream implementation feels like.

At the same time, java-10 indeed runs the generator (Supplier) a lot less times (it's not always 5), so probably there was a change internally to faster short-circuit the operations or cancel the tasks that already stared.

Eugene
  • 117,005
  • 15
  • 201
  • 306
  • I guess you have asked the same question some time back ;) – Thiyagu Jun 26 '18 at 03:48
  • Just realized that [this question](https://stackoverflow.com/questions/50064786/internal-changes-for-limit-and-unordered-stream) had been asked after you wrote this answer. – Thiyagu Jun 26 '18 at 03:49
0

Just a wild guess, since I'm not that familiar with the technical details:

There is a thread pool. If there is a job to do and an idle thread is available it might be reused. Generator and Consumer may use the same threads but it happens independently.

As the Instream-javadocs state IntStream.generate seems to Return[..] an infinite sequential unordered stream, whatever that means. I guess it just stops generating values since because of a garbage collector round that detects that nobody is interested in the results anymore.

Maybe IntStream.range(0, 5) is what you are looking for. This also eliminates the need for the atomic integer and the function side effects.

lupz
  • 3,620
  • 2
  • 27
  • 43
  • IntStream.range(0, 5) not I want, because I need use generator to get data from a datasource, and every time the generator I called, it should return next record, so when it limit 5, it should return first 5 records, but in fact it get more then 5 records, and only consume 5 records, another records are missing – Max Apr 27 '18 at 11:14
  • How does your datasource access look like? – lupz Apr 27 '18 at 12:09
  • like consume 100 messages from queue – Max Apr 27 '18 at 12:38
0

After executing your code a number of times, this is what I have observed:

  • i.incrementAndGet() is executed a random number of times. Here are some counts: 384, 256, 128, 768, 640, 896, 1024. But the number of times this method is called is always divisible by 8. There are 8 threads involved.
  • The forEach always picks one thread at random (it can be the main thread or another ForkJoin pool thread) and prints its items out. No matter what you do, it is ordered.

I think the API is behaving correctly, since IntStream.generate is more suited to generate random numbers and effectively this is what it is doing. It's Javadoc description is:

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.

This is the test I have used to check the behaviour:

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);
});

My suggestion would be to run your code multiple times always to get a better picture of what is going on. It is not entirely true that the generator is called 512 times.

gil.fernandes
  • 12,978
  • 5
  • 63
  • 76
  • 1. parallel Stream should work in multiple threads when use forEach, but only have one thread to processing, I think its a bug – Max Apr 27 '18 at 11:28
  • @Max And it uses multiple threads. The printout in the `foreEach` method sometimes is written by the main thread and sometimes not. Try running my test code on your machine. – gil.fernandes Apr 27 '18 at 11:38
  • add sorted: limit(5).sorted().parallel() then can uses multiple threads, but we have this case: use generate to get record(message) from a data source, every time the generator we called, will return next record, it works fine when in non-parallel mode, but parallel mode is a better choice, it will have good performance(but it not works when we use parallel) – Max Apr 27 '18 at 11:43
0

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

Max
  • 21
  • 3