8、多线程讲解

01、多线程概述,线程、进程和多线程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

02、继承Thread类

在这里插入图片描述
在这里插入图片描述

 //创建线程的方式一:继承Thread类,重写run()方法,调用start开启线程
 //总结:注意线程开启不一定立即执行,由CPU调度执行
*/public class TestThread1 extends Thread{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 200; i++) {
            System.out.println("TestThread1在执行"+i);
        }
    }

    public static void main(String[] args) {
        //main线程,主线程
        //创建一个线程对象
        TestThread1 testThread1 = new TestThread1();
        //调用start()方法开启线程
        testThread1.start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("main线程在执行"+i);
        }
    }
}

输出(两个线程同时执行)

main线程在执行0
TestThread1在执行0
TestThread1在执行1
TestThread1在执行2
TestThread1在执行3
TestThread1在执行4
TestThread1在执行5
TestThread1在执行6
TestThread1在执行7
TestThread1在执行8
TestThread1在执行9
TestThread1在执行10
TestThread1在执行11
main线程在执行1
TestThread1在执行12
TestThread1在执行13
TestThread1在执行14
TestThread1在执行15
TestThread1在执行16
TestThread1在执行17
TestThread1在执行18
TestThread1在执行19
main线程在执行2
main线程在执行3
main线程在执行4
main线程在执行5
main线程在执行6
main线程在执行7
main线程在执行8
main线程在执行9
main线程在执行10
main线程在执行11
main线程在执行12
main线程在执行13
TestThread1在执行20
main线程在执行14
main线程在执行15
main线程在执行16
main线程在执行17
TestThread1在执行21
main线程在执行18
TestThread1在执行22
TestThread1在执行23
main线程在执行19
TestThread1在执行24
main线程在执行20
main线程在执行21
main线程在执行22
main线程在执行23
main线程在执行24
main线程在执行25
main线程在执行26
main线程在执行27
main线程在执行28
main线程在执行29
main线程在执行30
main线程在执行31
main线程在执行32
main线程在执行33
main线程在执行34
main线程在执行35
main线程在执行36
main线程在执行37
main线程在执行38
main线程在执行39
main线程在执行40
main线程在执行41
main线程在执行42
main线程在执行43
main线程在执行44
main线程在执行45
main线程在执行46
main线程在执行47
main线程在执行48
main线程在执行49
main线程在执行50
TestThread1在执行25
TestThread1在执行26
TestThread1在执行27
TestThread1在执行28
TestThread1在执行29
TestThread1在执行30
TestThread1在执行31
TestThread1在执行32
TestThread1在执行33
TestThread1在执行34
TestThread1在执行35
TestThread1在执行36
main线程在执行51
TestThread1在执行37
TestThread1在执行38
TestThread1在执行39
TestThread1在执行40
TestThread1在执行41
TestThread1在执行42
TestThread1在执行43
TestThread1在执行44
TestThread1在执行45
TestThread1在执行46
TestThread1在执行47
TestThread1在执行48
TestThread1在执行49
TestThread1在执行50
TestThread1在执行51
TestThread1在执行52
TestThread1在执行53
TestThread1在执行54
TestThread1在执行55
TestThread1在执行56
TestThread1在执行57
TestThread1在执行58
TestThread1在执行59
TestThread1在执行60
main线程在执行52
main线程在执行53
TestThread1在执行61
TestThread1在执行62
main线程在执行54
TestThread1在执行63
main线程在执行55
main线程在执行56
main线程在执行57
TestThread1在执行64
main线程在执行58
main线程在执行59
TestThread1在执行65
main线程在执行60
main线程在执行61
TestThread1在执行66
TestThread1在执行67
TestThread1在执行68
TestThread1在执行69
TestThread1在执行70
main线程在执行62
main线程在执行63
main线程在执行64
main线程在执行65
main线程在执行66
main线程在执行67
TestThread1在执行71
main线程在执行68
main线程在执行69
main线程在执行70
TestThread1在执行72
TestThread1在执行73
TestThread1在执行74
main线程在执行71
main线程在执行72
TestThread1在执行75
main线程在执行73
main线程在执行74
main线程在执行75
main线程在执行76
main线程在执行77
main线程在执行78
main线程在执行79
main线程在执行80
main线程在执行81
TestThread1在执行76
main线程在执行82
main线程在执行83
main线程在执行84
main线程在执行85
main线程在执行86
TestThread1在执行77
main线程在执行87
main线程在执行88
main线程在执行89
main线程在执行90
main线程在执行91
main线程在执行92
main线程在执行93
main线程在执行94
main线程在执行95
main线程在执行96
main线程在执行97
main线程在执行98
main线程在执行99
main线程在执行100
main线程在执行101
main线程在执行102
main线程在执行103
main线程在执行104
main线程在执行105
main线程在执行106
main线程在执行107
TestThread1在执行78
main线程在执行108
main线程在执行109
main线程在执行110
main线程在执行111
main线程在执行112
main线程在执行113
main线程在执行114
main线程在执行115
main线程在执行116
main线程在执行117
main线程在执行118
main线程在执行119
main线程在执行120
main线程在执行121
main线程在执行122
main线程在执行123
main线程在执行124
main线程在执行125
TestThread1在执行79
TestThread1在执行80
main线程在执行126
main线程在执行127
main线程在执行128
main线程在执行129
main线程在执行130
main线程在执行131
main线程在执行132
main线程在执行133
main线程在执行134
main线程在执行135
main线程在执行136
main线程在执行137
main线程在执行138
main线程在执行139
main线程在执行140
main线程在执行141
main线程在执行142
main线程在执行143
main线程在执行144
main线程在执行145
main线程在执行146
main线程在执行147
main线程在执行148
main线程在执行149
main线程在执行150
main线程在执行151
main线程在执行152
main线程在执行153
main线程在执行154
main线程在执行155
main线程在执行156
main线程在执行157
main线程在执行158
main线程在执行159
main线程在执行160
TestThread1在执行81
TestThread1在执行82
TestThread1在执行83
TestThread1在执行84
TestThread1在执行85
main线程在执行161
main线程在执行162
main线程在执行163
main线程在执行164
main线程在执行165
main线程在执行166
TestThread1在执行86
main线程在执行167
TestThread1在执行87
main线程在执行168
main线程在执行169
main线程在执行170
main线程在执行171
TestThread1在执行88
main线程在执行172
TestThread1在执行89
TestThread1在执行90
main线程在执行173
main线程在执行174
main线程在执行175
main线程在执行176
TestThread1在执行91
main线程在执行177
main线程在执行178
TestThread1在执行92
TestThread1在执行93
TestThread1在执行94
TestThread1在执行95
TestThread1在执行96
TestThread1在执行97
TestThread1在执行98
TestThread1在执行99
main线程在执行179
TestThread1在执行100
TestThread1在执行101
TestThread1在执行102
TestThread1在执行103
TestThread1在执行104
TestThread1在执行105
TestThread1在执行106
main线程在执行180
TestThread1在执行107
TestThread1在执行108
TestThread1在执行109
TestThread1在执行110
TestThread1在执行111
TestThread1在执行112
TestThread1在执行113
TestThread1在执行114
TestThread1在执行115
main线程在执行181
TestThread1在执行116
main线程在执行182
main线程在执行183
main线程在执行184
main线程在执行185
main线程在执行186
main线程在执行187
main线程在执行188
TestThread1在执行117
TestThread1在执行118
TestThread1在执行119
TestThread1在执行120
TestThread1在执行121
TestThread1在执行122
TestThread1在执行123
TestThread1在执行124
TestThread1在执行125
TestThread1在执行126
TestThread1在执行127
main线程在执行189
main线程在执行190
main线程在执行191
main线程在执行192
main线程在执行193
main线程在执行194
main线程在执行195
main线程在执行196
main线程在执行197
main线程在执行198
main线程在执行199
main线程在执行200
main线程在执行201
main线程在执行202
main线程在执行203
main线程在执行204
TestThread1在执行128
main线程在执行205
main线程在执行206
main线程在执行207
TestThread1在执行129
TestThread1在执行130
TestThread1在执行131
TestThread1在执行132
TestThread1在执行133
TestThread1在执行134
TestThread1在执行135
main线程在执行208
main线程在执行209
main线程在执行210
main线程在执行211
main线程在执行212
main线程在执行213
TestThread1在执行136
main线程在执行214
main线程在执行215
main线程在执行216
main线程在执行217
main线程在执行218
main线程在执行219
main线程在执行220
main线程在执行221
main线程在执行222
main线程在执行223
main线程在执行224
main线程在执行225
main线程在执行226
TestThread1在执行137
main线程在执行227
main线程在执行228
main线程在执行229
main线程在执行230
main线程在执行231
main线程在执行232
main线程在执行233
main线程在执行234
main线程在执行235
main线程在执行236
TestThread1在执行138
TestThread1在执行139
TestThread1在执行140
TestThread1在执行141
TestThread1在执行142
TestThread1在执行143
TestThread1在执行144
TestThread1在执行145
main线程在执行237
main线程在执行238
main线程在执行239
main线程在执行240
main线程在执行241
main线程在执行242
main线程在执行243
main线程在执行244
main线程在执行245
main线程在执行246
main线程在执行247
main线程在执行248
main线程在执行249
main线程在执行250
main线程在执行251
main线程在执行252
main线程在执行253
main线程在执行254
main线程在执行255
main线程在执行256
main线程在执行257
main线程在执行258
main线程在执行259
main线程在执行260
main线程在执行261
main线程在执行262
main线程在执行263
TestThread1在执行146
main线程在执行264
main线程在执行265
main线程在执行266
TestThread1在执行147
TestThread1在执行148
TestThread1在执行149
TestThread1在执行150
main线程在执行267
main线程在执行268
main线程在执行269
main线程在执行270
main线程在执行271
TestThread1在执行151
main线程在执行272
main线程在执行273
main线程在执行274
main线程在执行275
main线程在执行276
main线程在执行277
main线程在执行278
main线程在执行279
main线程在执行280
TestThread1在执行152
TestThread1在执行153
TestThread1在执行154
TestThread1在执行155
main线程在执行281
main线程在执行282
main线程在执行283
main线程在执行284
TestThread1在执行156
TestThread1在执行157
TestThread1在执行158
TestThread1在执行159
TestThread1在执行160
main线程在执行285
main线程在执行286
main线程在执行287
main线程在执行288
main线程在执行289
TestThread1在执行161
TestThread1在执行162
TestThread1在执行163
main线程在执行290
main线程在执行291
main线程在执行292
main线程在执行293
main线程在执行294
main线程在执行295
main线程在执行296
main线程在执行297
main线程在执行298
main线程在执行299
main线程在执行300
main线程在执行301
main线程在执行302
main线程在执行303
main线程在执行304
main线程在执行305
main线程在执行306
TestThread1在执行164
TestThread1在执行165
TestThread1在执行166
TestThread1在执行167
TestThread1在执行168
TestThread1在执行169
TestThread1在执行170
TestThread1在执行171
TestThread1在执行172
TestThread1在执行173
TestThread1在执行174
TestThread1在执行175
TestThread1在执行176
main线程在执行307
main线程在执行308
main线程在执行309
main线程在执行310
main线程在执行311
main线程在执行312
main线程在执行313
main线程在执行314
main线程在执行315
main线程在执行316
main线程在执行317
main线程在执行318
main线程在执行319
TestThread1在执行177
TestThread1在执行178
TestThread1在执行179
TestThread1在执行180
TestThread1在执行181
TestThread1在执行182
TestThread1在执行183
main线程在执行320
main线程在执行321
main线程在执行322
main线程在执行323
main线程在执行324
main线程在执行325
main线程在执行326
main线程在执行327
main线程在执行328
main线程在执行329
main线程在执行330
main线程在执行331
TestThread1在执行184
TestThread1在执行185
TestThread1在执行186
TestThread1在执行187
main线程在执行332
main线程在执行333
main线程在执行334
TestThread1在执行188
main线程在执行335
main线程在执行336
main线程在执行337
TestThread1在执行189
TestThread1在执行190
TestThread1在执行191
TestThread1在执行192
TestThread1在执行193
TestThread1在执行194
TestThread1在执行195
TestThread1在执行196
main线程在执行338
main线程在执行339
main线程在执行340
TestThread1在执行197
TestThread1在执行198
TestThread1在执行199
main线程在执行341
main线程在执行342
main线程在执行343
main线程在执行344
main线程在执行345
main线程在执行346
main线程在执行347
main线程在执行348
main线程在执行349
main线程在执行350
main线程在执行351
main线程在执行352
main线程在执行353
main线程在执行354
main线程在执行355
main线程在执行356
main线程在执行357
main线程在执行358
main线程在执行359
main线程在执行360
main线程在执行361
main线程在执行362
main线程在执行363
main线程在执行364
main线程在执行365
main线程在执行366
main线程在执行367
main线程在执行368
main线程在执行369
main线程在执行370
main线程在执行371
main线程在执行372
main线程在执行373
main线程在执行374
main线程在执行375
main线程在执行376
main线程在执行377
main线程在执行378
main线程在执行379
main线程在执行380
main线程在执行381
main线程在执行382
main线程在执行383
main线程在执行384
main线程在执行385
main线程在执行386
main线程在执行387
main线程在执行388
main线程在执行389
main线程在执行390
main线程在执行391
main线程在执行392
main线程在执行393
main线程在执行394
main线程在执行395
main线程在执行396
main线程在执行397
main线程在执行398
main线程在执行399
main线程在执行400
main线程在执行401
main线程在执行402
main线程在执行403
main线程在执行404
main线程在执行405
main线程在执行406
main线程在执行407
main线程在执行408
main线程在执行409
main线程在执行410
main线程在执行411
main线程在执行412
main线程在执行413
main线程在执行414
main线程在执行415
main线程在执行416
main线程在执行417
main线程在执行418
main线程在执行419
main线程在执行420
main线程在执行421
main线程在执行422
main线程在执行423
main线程在执行424
main线程在执行425
main线程在执行426
main线程在执行427
main线程在执行428
main线程在执行429
main线程在执行430
main线程在执行431
main线程在执行432
main线程在执行433
main线程在执行434
main线程在执行435
main线程在执行436
main线程在执行437
main线程在执行438
main线程在执行439
main线程在执行440
main线程在执行441
main线程在执行442
main线程在执行443
main线程在执行444
main线程在执行445
main线程在执行446
main线程在执行447
main线程在执行448
main线程在执行449
main线程在执行450
main线程在执行451
main线程在执行452
main线程在执行453
main线程在执行454
main线程在执行455
main线程在执行456
main线程在执行457
main线程在执行458
main线程在执行459
main线程在执行460
main线程在执行461
main线程在执行462
main线程在执行463
main线程在执行464
main线程在执行465
main线程在执行466
main线程在执行467
main线程在执行468
main线程在执行469
main线程在执行470
main线程在执行471
main线程在执行472
main线程在执行473
main线程在执行474
main线程在执行475
main线程在执行476
main线程在执行477
main线程在执行478
main线程在执行479
main线程在执行480
main线程在执行481
main线程在执行482
main线程在执行483
main线程在执行484
main线程在执行485
main线程在执行486
main线程在执行487
main线程在执行488
main线程在执行489
main线程在执行490
main线程在执行491
main线程在执行492
main线程在执行493
main线程在执行494
main线程在执行495
main线程在执行496
main线程在执行497
main线程在执行498
main线程在执行499
main线程在执行500
main线程在执行501
main线程在执行502
main线程在执行503
main线程在执行504
main线程在执行505
main线程在执行506
main线程在执行507
main线程在执行508
main线程在执行509
main线程在执行510
main线程在执行511
main线程在执行512
main线程在执行513
main线程在执行514
main线程在执行515
main线程在执行516
main线程在执行517
main线程在执行518
main线程在执行519
main线程在执行520
main线程在执行521
main线程在执行522
main线程在执行523
main线程在执行524
main线程在执行525
main线程在执行526
main线程在执行527
main线程在执行528
main线程在执行529
main线程在执行530
main线程在执行531
main线程在执行532
main线程在执行533
main线程在执行534
main线程在执行535
main线程在执行536
main线程在执行537
main线程在执行538
main线程在执行539
main线程在执行540
main线程在执行541
main线程在执行542
main线程在执行543
main线程在执行544
main线程在执行545
main线程在执行546
main线程在执行547
main线程在执行548
main线程在执行549
main线程在执行550
main线程在执行551
main线程在执行552
main线程在执行553
main线程在执行554
main线程在执行555
main线程在执行556
main线程在执行557
main线程在执行558
main线程在执行559
main线程在执行560
main线程在执行561
main线程在执行562
main线程在执行563
main线程在执行564
main线程在执行565
main线程在执行566
main线程在执行567
main线程在执行568
main线程在执行569
main线程在执行570
main线程在执行571
main线程在执行572
main线程在执行573
main线程在执行574
main线程在执行575
main线程在执行576
main线程在执行577
main线程在执行578
main线程在执行579
main线程在执行580
main线程在执行581
main线程在执行582
main线程在执行583
main线程在执行584
main线程在执行585
main线程在执行586
main线程在执行587
main线程在执行588
main线程在执行589
main线程在执行590
main线程在执行591
main线程在执行592
main线程在执行593
main线程在执行594
main线程在执行595
main线程在执行596
main线程在执行597
main线程在执行598
main线程在执行599
main线程在执行600
main线程在执行601
main线程在执行602
main线程在执行603
main线程在执行604
main线程在执行605
main线程在执行606
main线程在执行607
main线程在执行608
main线程在执行609
main线程在执行610
main线程在执行611
main线程在执行612
main线程在执行613
main线程在执行614
main线程在执行615
main线程在执行616
main线程在执行617
main线程在执行618
main线程在执行619
main线程在执行620
main线程在执行621
main线程在执行622
main线程在执行623
main线程在执行624
main线程在执行625
main线程在执行626
main线程在执行627
main线程在执行628
main线程在执行629
main线程在执行630
main线程在执行631
main线程在执行632
main线程在执行633
main线程在执行634
main线程在执行635
main线程在执行636
main线程在执行637
main线程在执行638
main线程在执行639
main线程在执行640
main线程在执行641
main线程在执行642
main线程在执行643
main线程在执行644
main线程在执行645
main线程在执行646
main线程在执行647
main线程在执行648
main线程在执行649
main线程在执行650
main线程在执行651
main线程在执行652
main线程在执行653
main线程在执行654
main线程在执行655
main线程在执行656
main线程在执行657
main线程在执行658
main线程在执行659
main线程在执行660
main线程在执行661
main线程在执行662
main线程在执行663
main线程在执行664
main线程在执行665
main线程在执行666
main线程在执行667
main线程在执行668
main线程在执行669
main线程在执行670
main线程在执行671
main线程在执行672
main线程在执行673
main线程在执行674
main线程在执行675
main线程在执行676
main线程在执行677
main线程在执行678
main线程在执行679
main线程在执行680
main线程在执行681
main线程在执行682
main线程在执行683
main线程在执行684
main线程在执行685
main线程在执行686
main线程在执行687
main线程在执行688
main线程在执行689
main线程在执行690
main线程在执行691
main线程在执行692
main线程在执行693
main线程在执行694
main线程在执行695
main线程在执行696
main线程在执行697
main线程在执行698
main线程在执行699
main线程在执行700
main线程在执行701
main线程在执行702
main线程在执行703
main线程在执行704
main线程在执行705
main线程在执行706
main线程在执行707
main线程在执行708
main线程在执行709
main线程在执行710
main线程在执行711
main线程在执行712
main线程在执行713
main线程在执行714
main线程在执行715
main线程在执行716
main线程在执行717
main线程在执行718
main线程在执行719
main线程在执行720
main线程在执行721
main线程在执行722
main线程在执行723
main线程在执行724
main线程在执行725
main线程在执行726
main线程在执行727
main线程在执行728
main线程在执行729
main线程在执行730
main线程在执行731
main线程在执行732
main线程在执行733
main线程在执行734
main线程在执行735
main线程在执行736
main线程在执行737
main线程在执行738
main线程在执行739
main线程在执行740
main线程在执行741
main线程在执行742
main线程在执行743
main线程在执行744
main线程在执行745
main线程在执行746
main线程在执行747
main线程在执行748
main线程在执行749
main线程在执行750
main线程在执行751
main线程在执行752
main线程在执行753
main线程在执行754
main线程在执行755
main线程在执行756
main线程在执行757
main线程在执行758
main线程在执行759
main线程在执行760
main线程在执行761
main线程在执行762
main线程在执行763
main线程在执行764
main线程在执行765
main线程在执行766
main线程在执行767
main线程在执行768
main线程在执行769
main线程在执行770
main线程在执行771
main线程在执行772
main线程在执行773
main线程在执行774
main线程在执行775
main线程在执行776
main线程在执行777
main线程在执行778
main线程在执行779
main线程在执行780
main线程在执行781
main线程在执行782
main线程在执行783
main线程在执行784
main线程在执行785
main线程在执行786
main线程在执行787
main线程在执行788
main线程在执行789
main线程在执行790
main线程在执行791
main线程在执行792
main线程在执行793
main线程在执行794
main线程在执行795
main线程在执行796
main线程在执行797
main线程在执行798
main线程在执行799
main线程在执行800
main线程在执行801
main线程在执行802
main线程在执行803
main线程在执行804
main线程在执行805
main线程在执行806
main线程在执行807
main线程在执行808
main线程在执行809
main线程在执行810
main线程在执行811
main线程在执行812
main线程在执行813
main线程在执行814
main线程在执行815
main线程在执行816
main线程在执行817
main线程在执行818
main线程在执行819
main线程在执行820
main线程在执行821
main线程在执行822
main线程在执行823
main线程在执行824
main线程在执行825
main线程在执行826
main线程在执行827
main线程在执行828
main线程在执行829
main线程在执行830
main线程在执行831
main线程在执行832
main线程在执行833
main线程在执行834
main线程在执行835
main线程在执行836
main线程在执行837
main线程在执行838
main线程在执行839
main线程在执行840
main线程在执行841
main线程在执行842
main线程在执行843
main线程在执行844
main线程在执行845
main线程在执行846
main线程在执行847
main线程在执行848
main线程在执行849
main线程在执行850
main线程在执行851
main线程在执行852
main线程在执行853
main线程在执行854
main线程在执行855
main线程在执行856
main线程在执行857
main线程在执行858
main线程在执行859
main线程在执行860
main线程在执行861
main线程在执行862
main线程在执行863
main线程在执行864
main线程在执行865
main线程在执行866
main线程在执行867
main线程在执行868
main线程在执行869
main线程在执行870
main线程在执行871
main线程在执行872
main线程在执行873
main线程在执行874
main线程在执行875
main线程在执行876
main线程在执行877
main线程在执行878
main线程在执行879
main线程在执行880
main线程在执行881
main线程在执行882
main线程在执行883
main线程在执行884
main线程在执行885
main线程在执行886
main线程在执行887
main线程在执行888
main线程在执行889
main线程在执行890
main线程在执行891
main线程在执行892
main线程在执行893
main线程在执行894
main线程在执行895
main线程在执行896
main线程在执行897
main线程在执行898
main线程在执行899
main线程在执行900
main线程在执行901
main线程在执行902
main线程在执行903
main线程在执行904
main线程在执行905
main线程在执行906
main线程在执行907
main线程在执行908
main线程在执行909
main线程在执行910
main线程在执行911
main线程在执行912
main线程在执行913
main线程在执行914
main线程在执行915
main线程在执行916
main线程在执行917
main线程在执行918
main线程在执行919
main线程在执行920
main线程在执行921
main线程在执行922
main线程在执行923
main线程在执行924
main线程在执行925
main线程在执行926
main线程在执行927
main线程在执行928
main线程在执行929
main线程在执行930
main线程在执行931
main线程在执行932
main线程在执行933
main线程在执行934
main线程在执行935
main线程在执行936
main线程在执行937
main线程在执行938
main线程在执行939
main线程在执行940
main线程在执行941
main线程在执行942
main线程在执行943
main线程在执行944
main线程在执行945
main线程在执行946
main线程在执行947
main线程在执行948
main线程在执行949
main线程在执行950
main线程在执行951
main线程在执行952
main线程在执行953
main线程在执行954
main线程在执行955
main线程在执行956
main线程在执行957
main线程在执行958
main线程在执行959
main线程在执行960
main线程在执行961
main线程在执行962
main线程在执行963
main线程在执行964
main线程在执行965
main线程在执行966
main线程在执行967
main线程在执行968
main线程在执行969
main线程在执行970
main线程在执行971
main线程在执行972
main线程在执行973
main线程在执行974
main线程在执行975
main线程在执行976
main线程在执行977
main线程在执行978
main线程在执行979
main线程在执行980
main线程在执行981
main线程在执行982
main线程在执行983
main线程在执行984
main线程在执行985
main线程在执行986
main线程在执行987
main线程在执行988
main线程在执行989
main线程在执行990
main线程在执行991
main线程在执行992
main线程在执行993
main线程在执行994
main线程在执行995
main线程在执行996
main线程在执行997
main线程在执行998
main线程在执行999

Process finished with exit code 0

03、网图下载

在这里插入图片描述

//练习Thread,实现多线程同步下载图片
public class TestThread2 extends Thread{
    private String url;//网络图片地址名
    private String name;//保存文件的名字
    public TestThread2(String url,String name){//快速打出TestThread2:双击tt
        this.url = url;
        this.name = name;
    }
    //下载图片的执行体
    @Override
    public void run() {
        WebDownloader webDownloader = new WebDownloader();
        webDownloader.downloader(url,name);
        System.out.println("下载了文件名为:"+name);
    }

    public static void main(String[] args) {
        TestThread2 t1 = new TestThread2("https://img1.baidu.com/it/u=3772885595,4193385771&fm=26&fmt=auto&gp=0.jpg","红色大公鸡.jpg");
        TestThread2 t2 = new TestThread2("https://image.baidu.com/search/detail?ct=503316480&z=&tn=baiduimagedetail&ipn=d&word=%E4%B8%AD%E5%9B%BD&step_word=&ie=utf-8&in=&cl=2&lm=-1&st=-1&hd=&latest=&copyright=&cs=3032253879,1804093343&os=2084525728,2178890702&simid=3466826632,181998237&pn=5&rn=1&di=15620&ln=1610&fr=&fmq=1617019699904_R&ic=&s=undefined&se=&sme=&tab=0&width=&height=&face=undefined&is=0,0&istype=2&ist=&jit=&bdtype=0&spn=0&pi=0&gsm=0&objurl=https%3A%2F%2Fgimg2.baidu.com%2Fimage_search%2Fsrc%3Dhttp%253A%252F%252F117.img.pp.sohu.com%252Fimages%252Fblog%252F2008%252F4%252F12%252F10%252F11%252F119599c6736.jpg%26refer%3Dhttp%253A%252F%252F117.img.pp.sohu.com%26app%3D2002%26size%3Df9999%2C10000%26q%3Da80%26n%3D0%26g%3D0n%26fmt%3Djpeg%3Fsec%3D1619611699%26t%3D52a67c8578a341a0bf7a1f27a561fd48&rpstart=0&rpnum=0&adpicid=0&force=undefined","红旗.jpg");
        TestThread2 t3 = new TestThread2("https://img1.baidu.com/it/u=3176794680,1446450029&fm=26&fmt=auto&gp=0.jpg","军人.jpg");
        t1.start();
        t2.start();
        t3.start();
    }
}

//下载器
class WebDownloader{
    //下载方法
    public void downloader(String url,String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常,downloder方法出现问题");
        }
    }
}

输出

下载了文件名为:军人.jpg
下载了文件名为:红色大公鸡.jpg
下载了文件名为:红旗.jpg
  • 输出不是按照顺序输出的,按照CPU的调度来进行

04、实现Runnable接口

在这里插入图片描述
在这里插入图片描述

//创建线程方式2:实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法
public class TestThread3 implements Runnable{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 200; i++) {
            System.out.println("TestThread1在执行" + i);
        }
    }

    public static void main(String[] args) {
        //创建runnable接口的实现类对象
        TestThread3 testThread3 = new TestThread3();
        //创建线程对象,通过线程对象来开启我们的线程,代理
//        Thread thread = new Thread(testThread3);
//
//        thread.start();
        new Thread(testThread3).start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("main线程在执行"+i);
        }
    }
}

05、初识并发问题

/*
多个线程同时操作同一个对象
买火车票的例子
问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱
 */
public class TestThread4 implements Runnable{

    //票数
    private int ticketNums = 10;
    @Override
    public void run() {
        while(true){
            if (ticketNums<=0){
                break;
            }
            //模拟延迟
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"-->拿到了第"+ticketNums--+"张票");
        }

    }

    public static void main(String[] args) {
        TestThread4 ticket = new TestThread4();
        new Thread(ticket,"老师").start();
        new Thread(ticket,"小明").start();
        new Thread(ticket,"黄牛").start();
    }
}

输出:
小明-->拿到了第9张票
老师-->拿到了第8张票
黄牛-->拿到了第10张票
小明-->拿到了第7张票
老师-->拿到了第5张票
黄牛-->拿到了第6张票
黄牛-->拿到了第3张票
老师-->拿到了第3张票
小明-->拿到了第4张票
黄牛-->拿到了第2张票
小明-->拿到了第1张票
老师-->拿到了第2张票

06、龟兔赛跑

在这里插入图片描述

public class Race implements Runnable{
    private static String winner;
    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            //模拟兔子睡觉
            if (Thread.currentThread().getName().equals("兔子")&&((i%10)==0)){
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //判断比赛是否结束
            boolean flag = gameOver(i);
            //如果比赛结束,就停止程序
            if (flag){
                break;
            }

            System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"步");
            
        }
        
        
    }
    
    //判断是否完成比赛
    private boolean gameOver(int steps){
        //判断是否有胜利者
        if(winner!=null){//已经存在胜利者了
            return true;
        }{
            if(steps>=100){
                winner = Thread.currentThread().getName();
                System.out.println("winner is"+ winner);
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Race race = new Race();
        new Thread(race,"兔子").start();
        new Thread(race,"乌龟").start();
    }
}
输出:
兔子-->跑了1步
乌龟-->跑了1步
兔子-->跑了2步
乌龟-->跑了2步
兔子-->跑了3步
乌龟-->跑了3步
兔子-->跑了4步
乌龟-->跑了4步
乌龟-->跑了5步
乌龟-->跑了6步
乌龟-->跑了7步
兔子-->跑了5步
乌龟-->跑了8步
兔子-->跑了6步
乌龟-->跑了9步
乌龟-->跑了10步
乌龟-->跑了11步
兔子-->跑了7步
兔子-->跑了8步
乌龟-->跑了12步
兔子-->跑了9步
乌龟-->跑了13步
乌龟-->跑了14步
乌龟-->跑了15步
乌龟-->跑了16步
乌龟-->跑了17步
乌龟-->跑了18步
乌龟-->跑了19步
乌龟-->跑了20步
乌龟-->跑了21步
乌龟-->跑了22步
乌龟-->跑了23步
乌龟-->跑了24步
乌龟-->跑了25步
乌龟-->跑了26步
乌龟-->跑了27步
乌龟-->跑了28步
乌龟-->跑了29步
乌龟-->跑了30步
乌龟-->跑了31步
乌龟-->跑了32步
乌龟-->跑了33步
乌龟-->跑了34步
乌龟-->跑了35步
乌龟-->跑了36步
乌龟-->跑了37步
乌龟-->跑了38步
乌龟-->跑了39步
乌龟-->跑了40步
乌龟-->跑了41步
乌龟-->跑了42步
乌龟-->跑了43步
乌龟-->跑了44步
乌龟-->跑了45步
乌龟-->跑了46步
乌龟-->跑了47步
乌龟-->跑了48步
乌龟-->跑了49步
乌龟-->跑了50步
乌龟-->跑了51步
乌龟-->跑了52步
乌龟-->跑了53步
乌龟-->跑了54步
乌龟-->跑了55步
乌龟-->跑了56步
乌龟-->跑了57步
乌龟-->跑了58步
乌龟-->跑了59步
乌龟-->跑了60步
乌龟-->跑了61步
乌龟-->跑了62步
乌龟-->跑了63步
乌龟-->跑了64步
乌龟-->跑了65步
乌龟-->跑了66步
乌龟-->跑了67步
乌龟-->跑了68步
乌龟-->跑了69步
乌龟-->跑了70步
乌龟-->跑了71步
乌龟-->跑了72步
乌龟-->跑了73步
乌龟-->跑了74步
乌龟-->跑了75步
乌龟-->跑了76步
乌龟-->跑了77步
乌龟-->跑了78步
乌龟-->跑了79步
乌龟-->跑了80步
乌龟-->跑了81步
乌龟-->跑了82步
乌龟-->跑了83步
乌龟-->跑了84步
乌龟-->跑了85步
乌龟-->跑了86步
乌龟-->跑了87步
乌龟-->跑了88步
乌龟-->跑了89步
乌龟-->跑了90步
乌龟-->跑了91步
乌龟-->跑了92步
乌龟-->跑了93步
乌龟-->跑了94步
乌龟-->跑了95步
乌龟-->跑了96步
乌龟-->跑了97步
乌龟-->跑了98步
乌龟-->跑了99步
winner is乌龟

07、实现Callable接口

在这里插入图片描述

/*
创建线程方式三:实现callable接口
callable的好处
1.可以定义返回值
2.可以跑出异常
 */
public class TextCallable implements Callable<Boolean> {
    private String url;//网络图片地址名
    private String name;//保存文件的名字
    public TextCallable(String url,String name){//快速打出TestThread2:双击tt
        this.url = url;
        this.name = name;
    }
    //下载图片的执行体
    @Override
    public Boolean call() {
        WebDownloader webDownloader = new WebDownloader();
        webDownloader.downloader(url,name);
        System.out.println("下载了文件名为:"+name);
        return true;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        TextCallable t1 = new TextCallable("https://img1.baidu.com/it/u=3772885595,4193385771&fm=26&fmt=auto&gp=0.jpg","红色大公鸡.jpg");
        TextCallable t2 = new TextCallable("https://image.baidu.com/search/detail?ct=503316480&z=&tn=baiduimagedetail&ipn=d&word=%E4%B8%AD%E5%9B%BD&step_word=&ie=utf-8&in=&cl=2&lm=-1&st=-1&hd=&latest=&copyright=&cs=3032253879,1804093343&os=2084525728,2178890702&simid=3466826632,181998237&pn=5&rn=1&di=15620&ln=1610&fr=&fmq=1617019699904_R&ic=&s=undefined&se=&sme=&tab=0&width=&height=&face=undefined&is=0,0&istype=2&ist=&jit=&bdtype=0&spn=0&pi=0&gsm=0&objurl=https%3A%2F%2Fgimg2.baidu.com%2Fimage_search%2Fsrc%3Dhttp%253A%252F%252F117.img.pp.sohu.com%252Fimages%252Fblog%252F2008%252F4%252F12%252F10%252F11%252F119599c6736.jpg%26refer%3Dhttp%253A%252F%252F117.img.pp.sohu.com%26app%3D2002%26size%3Df9999%2C10000%26q%3Da80%26n%3D0%26g%3D0n%26fmt%3Djpeg%3Fsec%3D1619611699%26t%3D52a67c8578a341a0bf7a1f27a561fd48&rpstart=0&rpnum=0&adpicid=0&force=undefined","红旗.jpg");
        TextCallable t3 = new TextCallable("https://img1.baidu.com/it/u=3176794680,1446450029&fm=26&fmt=auto&gp=0.jpg","军人.jpg");

        //创建执行服务
        ExecutorService ser = Executors.newFixedThreadPool(3);

        //提交执行
        Future<Boolean> r1 = ser.submit(t1);
        Future<Boolean> r2 = ser.submit(t2);
        Future<Boolean> r3 = ser.submit(t3);

        //获取结果
        Boolean rs1 = r1.get();
        Boolean rs2 = r2.get();
        Boolean rs3 = r3.get();

        System.out.println(rs1);
        System.out.println(rs2);
        System.out.println(rs3);

        //关闭服务
        ser.shutdown();

    }
    class WebDownloader{
        //下载方法
        public void downloader(String url,String name){
            try {
                FileUtils.copyURLToFile(new URL(url),new File(name));
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("IO异常,downloder方法出现问题");
            }
        }
    }
}
=======================================
输出:
下载了文件名为:红色大公鸡.jpg
下载了文件名为:军人.jpg
下载了文件名为:红旗.jpg
true
true
true

08、静态代理模式

在这里插入图片描述

/*
静态代理总结:
1.真实对象和代理对象都要事先同一个接口
2.代理对象要代理真实角色
优点:
1.代理对象可以做很多真实对象无法做的事
2.真实对象专注做自己的事
 */
public class StaticProxy {
    public static void main(String[] args) {
        WeddingCompany weddingCompany = new WeddingCompany(new You());
        weddingCompany.HappyMarry();
    }
}

interface Marry{//结婚的接口类,不论是个人还是婚庆公司都需要实现
    void HappyMarry();
}

//真实角色,YOU
class You implements Marry{

    @Override
    public void HappyMarry() {
        System.out.println("我结婚超开心");
    }
}

//婚庆公司,帮助你结婚
class WeddingCompany implements Marry{
    private Marry target;//这里是静态代理的核心

    public WeddingCompany(Marry target) {
        this.target = target;
    }

    @Override
    public void HappyMarry() {
        before();
        this.target.HappyMarry();
        after();
    }

    private void after() {
        System.out.println("结婚之后,婚庆公司收尾款");
    }

    private void before() {
        System.out.println("结婚之前婚庆公司布置现场");
    }
}
================输出
结婚之前婚庆公司布置现场
我结婚超开心
结婚之后,婚庆公司收尾

09、Lambda表达式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
lambda表达式的演化过程

//推导lambda表达式
public class TestLambda1 {

    //3.静态内部类
    static class Like2 implements ILike{
        @Override
        public void lambda() {
            System.out.println("i lke lambda2");
        }
    }

    public static void main(String[] args) {
        ILike like = new Like();
        like.lambda();

        like = new Like2();
        like.lambda();

        //4.局部内部类
        class Like3 implements ILike{
            @Override
            public void lambda() {
                System.out.println("i lke lambda3");
            }
        }
        like = new Like3();
        like.lambda();

        //5.匿名内部类,没有类的名称必须借助接口或者父类
        like = new ILike() {
            @Override
            public void lambda() {
                System.out.println("i lke lambda4");
            }
        };
        like.lambda();

        //6.用lambda来简化
        like = ()->{
            System.out.println("i lke lambda5");
        };
        like.lambda();

    }
}

//1.定义一个函数式接口
interface ILike{
    void lambda();
}

//2.接口的实现类
class Like implements ILike{
    @Override
    public void lambda() {
        System.out.println("i lke lambda1");
    }
}
==================
输出
i lke lambda1
i lke lambda2
i lke lambda3
i lke lambda4
i lke lambda5

lambda表达式优化

public class TestLambda2 {
    public static void main(String[] args) {
         ILove love = (int a) ->{
                System.out.println("i love you--->"+a);
            };
         //简化1:去除参数类型
        love = ( a) ->{
            System.out.println("i love you--->"+a);
        };
        //简化2:去除括号
        love =  a->{
            System.out.println("i love you--->"+a);
        };
        //简化3:去除花括号
        love =  a ->  System.out.println("i love you--->"+a);

        /*
        总结:
        lambda表达式只能有一行代码的情况下才能简化成一行,如果有多行,那么就用代码块包裹
        前提是接口为函数式接口
        多个参数也可以去掉参数类型,要去掉就都去掉,必须加上括号
         */

         love.love(520);
        }

    }
interface  ILove{
    void love(int a);
}

如果要写成类似 System.out::println的方法

 //简化3:去除花括号
        love =  a ->  System.out.println(a);
 //简化4:去除花括号变成 ::,除去参数
        love =  System.sout::printIn;

10、线程停止

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试stop
1.建议线程正常停止:利用次数不建议死循环
2.建议使用标志位:设置一个标志位
3.不要使用stop或者destroy等果实或者JDK不建议使用的方法
 */
public class TestStop implements Runnable {

    //1.设置一个标识位
    private boolean flag = true;

    @Override
    public void run() {
        int i = 0;
        while (flag){
            System.out.println("running.......Thread"+i++);
        }

    }
    //设置一个公开的方法来停止线程,转换标识符
    public void stop(){
        this.flag = false;
    }

    public static void main(String[] args) {
        TestStop testStop = new TestStop();
        new Thread(testStop).start();
        for (int i = 0; i < 100; i++) {
            System.out.println("main"+i);
            if (i==90){
                testStop.stop();
                System.out.println("线程该停止了");
            }
        }
    }
}
===================
输出
main0
main1
main2
main3
main4
main5
main6
running.......Thread0
main7
main8
main9
main10
main11
main12
main13
main14
main15
main16
main17
main18
main19
main20
main21
main22
main23
main24
main25
main26
main27
running.......Thread1
main28
running.......Thread2
main29
running.......Thread3
main30
main31
main32
main33
main34
main35
main36
running.......Thread4
main37
running.......Thread5
running.......Thread6
running.......Thread7
running.......Thread8
main38
running.......Thread9
main39
main40
main41
running.......Thread10
main42
running.......Thread11
main43
running.......Thread12
main44
running.......Thread13
running.......Thread14
running.......Thread15
running.......Thread16
running.......Thread17
running.......Thread18
running.......Thread19
running.......Thread20
running.......Thread21
running.......Thread22
main45
main46
main47
main48
main49
main50
main51
main52
main53
main54
main55
main56
main57
main58
main59
running.......Thread23
running.......Thread24
main60
main61
running.......Thread25
running.......Thread26
main62
running.......Thread27
running.......Thread28
running.......Thread29
running.......Thread30
running.......Thread31
running.......Thread32
running.......Thread33
running.......Thread34
running.......Thread35
running.......Thread36
main63
main64
main65
main66
main67
main68
main69
main70
main71
main72
main73
main74
main75
main76
main77
main78
main79
main80
main81
running.......Thread37
main82
running.......Thread38
main83
running.......Thread39
main84
main85
main86
main87
running.......Thread40
running.......Thread41
main88
running.......Thread42
running.......Thread43
running.......Thread44
running.......Thread45
running.......Thread46
running.......Thread47
running.......Thread48
main89
main90
running.......Thread49
线程该停止了
main91
main92
main93
main94
main95
main96
main97
main98
main99

Process finished with exit code 0

11.线程休眠_sleep

在这里插入图片描述

public class TimeSleep1 {
    public static void main(String[] args) {
  //打印当前时间
        Date startTime = new Date(System.currentTimeMillis());//获取当前时间

        while (true){
            try {
                Thread.sleep(1000);
                System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
                startTime = new Date(System.currentTimeMillis());//更新当前时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    //模拟倒计时
    public static void tenDown() throws InterruptedException {
        int num = 10;
        while (true){
            Thread.sleep(1000);
            System.out.println(num--);
            if (num<=0){
                break;
            }
        }
    }
}

12、线程礼让_yield

在这里插入图片描述

/*
测试礼让线程
礼让不一定成功,看CPU心情
 */
public class TestYield {
    public static void main(String[] args) {
        MyYield myYield = new MyYield();
        new Thread(myYield,"a").start();
        new Thread(myYield,"b").start();
    }
}

class MyYield implements Runnable {

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"开始");
        Thread.yield();
        System.out.println(Thread.currentThread().getName()+"结束");

    }
}

13、线程强制执行_join

在这里插入图片描述

//测试join()方法,类似插队
public class TestJoin implements Runnable{

    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < 100; i++) {
            System.out.println("线程vip驾到"+i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        //启动线程
        TestJoin testJoin = new TestJoin();
        Thread thread = new Thread(testJoin);
        thread.start();
        //主线程
        for (int i = 0; i < 250; i++) {
            if (i==200){
                thread.join();
            }
            System.out.println("main"+i);
        }
    }
}

=============================
输出
E:\Environment\Java\jdk1.8\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=54198:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\Environment\Java\jdk1.8\jre\lib\charsets.jar;E:\Environment\Java\jdk1.8\jre\lib\deploy.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\access-bridge-64.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\cldrdata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\dnsns.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jaccess.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jfxrt.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\localedata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\nashorn.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunec.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunjce_provider.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunmscapi.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunpkcs11.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\zipfs.jar;E:\Environment\Java\jdk1.8\jre\lib\javaws.jar;E:\Environment\Java\jdk1.8\jre\lib\jce.jar;E:\Environment\Java\jdk1.8\jre\lib\jfr.jar;E:\Environment\Java\jdk1.8\jre\lib\jfxswt.jar;E:\Environment\Java\jdk1.8\jre\lib\jsse.jar;E:\Environment\Java\jdk1.8\jre\lib\management-agent.jar;E:\Environment\Java\jdk1.8\jre\lib\plugin.jar;E:\Environment\Java\jdk1.8\jre\lib\resources.jar;E:\Environment\Java\jdk1.8\jre\lib\rt.jar;E:\IDEAcode\JavaSE\out\production\基础语法;E:\IDEAcode\JavaSE\基础语法\src\com\lib\commons-io-2.8.0.jar com.wzt.www.thread.state.TestJoin
main0
main1
main2
main3
main4
main5
main6
main7
main8
main9
main10
main11
main12
main13
main14
main15
main16
main17
main18
main19
main20
main21
main22
main23
main24
main25
main26
main27
main28
main29
main30
main31
main32
main33
main34
main35
main36
main37
main38
main39
main40
main41
main42
main43
main44
main45
main46
main47
main48
main49
main50
main51
main52
main53
main54
main55
main56
main57
main58
main59
main60
main61
main62
main63
main64
main65
main66
main67
main68
main69
main70
main71
main72
main73
main74
main75
main76
main77
main78
main79
main80
main81
main82
main83
main84
main85
main86
main87
main88
main89
main90
main91
main92
main93
main94
main95
main96
main97
main98
main99
main100
main101
main102
main103
main104
main105
main106
main107
main108
main109
main110
main111
main112
main113
main114
main115
main116
main117
main118
main119
main120
main121
main122
main123
main124
main125
main126
main127
main128
main129
main130
main131
main132
main133
main134
main135
main136
main137
main138
main139
main140
main141
main142
main143
main144
main145
main146
main147
main148
main149
main150
main151
main152
main153
main154
main155
main156
main157
main158
main159
main160
main161
main162
main163
main164
main165
main166
main167
main168
main169
main170
main171
main172
main173
main174
main175
main176
main177
main178
main179
main180
main181
main182
main183
main184
main185
main186
main187
main188
main189
main190
main191
main192
main193
main194
main195
main196
main197
main198
main199
线程vip驾到0
线程vip驾到1
线程vip驾到2
线程vip驾到3
线程vip驾到4
线程vip驾到5
线程vip驾到6
线程vip驾到7
线程vip驾到8
线程vip驾到9
线程vip驾到10
线程vip驾到11
线程vip驾到12
线程vip驾到13
线程vip驾到14
线程vip驾到15
线程vip驾到16
线程vip驾到17
线程vip驾到18
线程vip驾到19
线程vip驾到20
线程vip驾到21
线程vip驾到22
线程vip驾到23
线程vip驾到24
线程vip驾到25
线程vip驾到26
线程vip驾到27
线程vip驾到28
线程vip驾到29
线程vip驾到30
线程vip驾到31
线程vip驾到32
线程vip驾到33
线程vip驾到34
线程vip驾到35
线程vip驾到36
线程vip驾到37
线程vip驾到38
线程vip驾到39
线程vip驾到40
线程vip驾到41
线程vip驾到42
线程vip驾到43
线程vip驾到44
线程vip驾到45
线程vip驾到46
线程vip驾到47
线程vip驾到48
线程vip驾到49
线程vip驾到50
线程vip驾到51
线程vip驾到52
线程vip驾到53
线程vip驾到54
线程vip驾到55
线程vip驾到56
线程vip驾到57
线程vip驾到58
线程vip驾到59
线程vip驾到60
线程vip驾到61
线程vip驾到62
线程vip驾到63
线程vip驾到64
线程vip驾到65
线程vip驾到66
线程vip驾到67
线程vip驾到68
线程vip驾到69
线程vip驾到70
线程vip驾到71
线程vip驾到72
线程vip驾到73
线程vip驾到74
线程vip驾到75
线程vip驾到76
线程vip驾到77
线程vip驾到78
线程vip驾到79
线程vip驾到80
线程vip驾到81
线程vip驾到82
线程vip驾到83
线程vip驾到84
线程vip驾到85
线程vip驾到86
线程vip驾到87
线程vip驾到88
线程vip驾到89
线程vip驾到90
线程vip驾到91
线程vip驾到92
线程vip驾到93
线程vip驾到94
线程vip驾到95
线程vip驾到96
线程vip驾到97
线程vip驾到98
线程vip驾到99
main200
main201
main202
main203
main204
main205
main206
main207
main208
main209
main210
main211
main212
main213
main214
main215
main216
main217
main218
main219
main220
main221
main222
main223
main224
main225
main226
main227
main228
main229
main230
main231
main232
main233
main234
main235
main236
main237
main238
main239
main240
main241
main242
main243
main244
main245
main246
main247
main248
main249

Process finished with exit code 0

14、观测线程状态

在这里插入图片描述

//观察测试线程的状态
public class TestState {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
            System.out.println("............");
        });
        //观察状态
        Thread.State state = thread.getState();
        System.out.println(state);//NEW
        //观察启动后
        thread.start();
        state = thread.getState();
        System.out.println(state);//Run

        //只要线程不终止就一直输出状态
        while (state != Thread.State.TERMINATED){
            Thread.sleep(100);
            state = thread.getState();//更新状态
            System.out.println(state);
        }

        thread.start();//线程死亡后不可以再次运行了
    }
}
===================
输出
E:\Environment\Java\jdk1.8\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=61058:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\Environment\Java\jdk1.8\jre\lib\charsets.jar;E:\Environment\Java\jdk1.8\jre\lib\deploy.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\access-bridge-64.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\cldrdata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\dnsns.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jaccess.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jfxrt.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\localedata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\nashorn.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunec.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunjce_provider.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunmscapi.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunpkcs11.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\zipfs.jar;E:\Environment\Java\jdk1.8\jre\lib\javaws.jar;E:\Environment\Java\jdk1.8\jre\lib\jce.jar;E:\Environment\Java\jdk1.8\jre\lib\jfr.jar;E:\Environment\Java\jdk1.8\jre\lib\jfxswt.jar;E:\Environment\Java\jdk1.8\jre\lib\jsse.jar;E:\Environment\Java\jdk1.8\jre\lib\management-agent.jar;E:\Environment\Java\jdk1.8\jre\lib\plugin.jar;E:\Environment\Java\jdk1.8\jre\lib\resources.jar;E:\Environment\Java\jdk1.8\jre\lib\rt.jar;E:\IDEAcode\JavaSE\out\production\基础语法;E:\IDEAcode\JavaSE\基础语法\src\com\lib\commons-io-2.8.0.jar com.wzt.www.thread.state.TestState
NEW
RUNNABLE
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
RUNNABLE
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
............
TERMINATED
Exception in thread "main" java.lang.IllegalThreadStateException
	at java.lang.Thread.start(Thread.java:708)
	at com.wzt.www.thread.state.TestState.main(TestState.java:36)

Process finished with exit code 1

15、线程的优先级

在这里插入图片描述
在这里插入图片描述

package com.wzt.www.thread.state;

import java.sql.SQLOutput;

/**
 * @author WZT
 * @create 2021-03-31 9:42
 */
//测试线程的优先级
public class TestPriority {
    //主线程默认优先级
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());

        MyPriority myPriority = new MyPriority();
        Thread thread1 = new Thread(myPriority);
        Thread thread2 = new Thread(myPriority);
        Thread thread3 = new Thread(myPriority);
        Thread thread4 = new Thread(myPriority);
        Thread thread5 = new Thread(myPriority);
        Thread thread6 = new Thread(myPriority);

        //先设置优先级然后再启动
        thread1.start();

        thread2.setPriority(7);
        thread2.start();

        thread3.setPriority(2);
        thread3.start();

        thread4.setPriority(Thread.MAX_PRIORITY);
        thread4.start();

        thread5.setPriority(Thread.MIN_PRIORITY);
        thread5.start();

        thread6.setPriority(Thread.NORM_PRIORITY);
        thread6.start();
    }
}

class MyPriority implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());
    }
}
================
输出
E:\Environment\Java\jdk1.8\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=61516:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\Environment\Java\jdk1.8\jre\lib\charsets.jar;E:\Environment\Java\jdk1.8\jre\lib\deploy.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\access-bridge-64.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\cldrdata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\dnsns.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jaccess.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jfxrt.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\localedata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\nashorn.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunec.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunjce_provider.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunmscapi.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunpkcs11.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\zipfs.jar;E:\Environment\Java\jdk1.8\jre\lib\javaws.jar;E:\Environment\Java\jdk1.8\jre\lib\jce.jar;E:\Environment\Java\jdk1.8\jre\lib\jfr.jar;E:\Environment\Java\jdk1.8\jre\lib\jfxswt.jar;E:\Environment\Java\jdk1.8\jre\lib\jsse.jar;E:\Environment\Java\jdk1.8\jre\lib\management-agent.jar;E:\Environment\Java\jdk1.8\jre\lib\plugin.jar;E:\Environment\Java\jdk1.8\jre\lib\resources.jar;E:\Environment\Java\jdk1.8\jre\lib\rt.jar;E:\IDEAcode\JavaSE\out\production\基础语法;E:\IDEAcode\JavaSE\基础语法\src\com\lib\commons-io-2.8.0.jar com.wzt.www.thread.state.TestPriority
main--->5
Thread-0--->5
Thread-2--->2
Thread-3--->10
Thread-1--->7
Thread-4--->1
Thread-5--->5

Process finished with exit code 0

16、守护线程

在这里插入图片描述

package com.wzt.www.thread.state;

/**
 * @author WZT
 * @create 2021-03-31 10:24
 */
//测试守护线程
//祖国守护你
public class TestDaemon {
    public static void main(String[] args) {
        You you = new You();
        China china = new China();
        Thread thread = new Thread(china);
        thread.setDaemon(true);//用户线程默认为false,守护线程需要设置为true
        thread.start();//守护线程启动
        new Thread(you).start();//你 用户线程启动
    }
}
//祖国
class China implements Runnable{
    @Override
    public void run() {
        while (true){
            System.out.println("祖国守护你");
        }
    }
}


//你
class You implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 36500; i++) {
            System.out.println("你一生都开心的活着");
        }
        System.out.println("======goodbye world!");
    }
}
==================================
输出
你一生都开心的活着
你一生都开心的活着
你一生都开心的活着
你一生都开心的活着
你一生都开心的活着
祖国守护你
======goodbye world!
祖国守护你
祖国守护你
祖国守护你
祖国守护你//等用户线程结束后,守护线程也会在处理结束任务后自动停止

17、线程同步机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

18、三大不安全案例

多人买票

package com.wzt.www.thread.syn;

/**
 * @author WZT
 * @create 2021-03-31 14:10
 */
public class UnsafeBuyTicket {
    public static void main(String[] args) {
        BuyTicket station = new BuyTicket();
        new Thread(station,"I").start();
        new Thread(station,"others").start();
        new Thread(station,"YellowBull").start();
    }
}
class BuyTicket implements Runnable{
    private int ticketNums = 10;
    private boolean flag = true;

    @Override
    public void run() {
        while (flag){
            try {
                buy();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    private void buy() throws InterruptedException {
        //判断是否有票
        if (ticketNums<=0){
            flag = false;
            return;
        }
        //买票
        Thread.sleep(1000);
        System.out.println(Thread.currentThread().getName()+"拿到"+ticketNums--);
    }
}
===================================================
E:\Environment\Java\jdk1.8\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=49574:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\Environment\Java\jdk1.8\jre\lib\charsets.jar;E:\Environment\Java\jdk1.8\jre\lib\deploy.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\access-bridge-64.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\cldrdata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\dnsns.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jaccess.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jfxrt.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\localedata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\nashorn.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunec.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunjce_provider.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunmscapi.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunpkcs11.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\zipfs.jar;E:\Environment\Java\jdk1.8\jre\lib\javaws.jar;E:\Environment\Java\jdk1.8\jre\lib\jce.jar;E:\Environment\Java\jdk1.8\jre\lib\jfr.jar;E:\Environment\Java\jdk1.8\jre\lib\jfxswt.jar;E:\Environment\Java\jdk1.8\jre\lib\jsse.jar;E:\Environment\Java\jdk1.8\jre\lib\management-agent.jar;E:\Environment\Java\jdk1.8\jre\lib\plugin.jar;E:\Environment\Java\jdk1.8\jre\lib\resources.jar;E:\Environment\Java\jdk1.8\jre\lib\rt.jar;E:\IDEAcode\JavaSE\out\production\基础语法;E:\IDEAcode\JavaSE\基础语法\src\com\lib\commons-io-2.8.0.jar com.wzt.www.thread.syn.UnsafeBuyTicket
I拿到10
others拿到8
YellowBull拿到9
others拿到7
I拿到6
YellowBull拿到6
YellowBull拿到5
I拿到5
others拿到5
others拿到4
I拿到4
YellowBull拿到4
YellowBull拿到3
others拿到3
I拿到3
others拿到2
YellowBull拿到2
I拿到2
others拿到1
I拿到0
YellowBull拿到0

Process finished with exit code 0

两人同时从银行取钱

package com.wzt.www.thread.syn;

/**
 * @author WZT
 * @create 2021-03-31 14:20
 */
public class UnsafeBank {
    public static void main(String[] args) {
        Account 购房存款 = new Account("购房存款", 100);
        Drawing= new Drawing(购房存款, 50, "你");
        Drawing 女友 = new Drawing(购房存款, 100, "女友");
        女友.start();.start();

    }
}

class Account{
    int money;
    String name;

    public Account( String name,int money) {
        this.money = money;
        this.name = name;
    }
}

class Drawing extends Thread{
    Account account;
    int drawingMoney;
    int nowMoney;

    public Drawing(Account account,int drawingMoney,String name){
        super(name);//这里的name是Thread的私有变量
        this.account = account;
        this.drawingMoney = drawingMoney;

    }

    @Override
    //取钱
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //判断是否有钱
        if ((account.money-drawingMoney)<0){
            System.out.println(Thread.currentThread().getName()+"钱不够取不了");
            return;
        }
        //卡内余额
        account.money = account.money - drawingMoney;
        nowMoney = nowMoney + drawingMoney;



        System.out.println(account.name + "余额为:"+account.money);
        //this.getName()=Thread.currentThread().getName()
        System.out.println(this.getName()+"手里的钱"+nowMoney);
    }
}
=================================
E:\Environment\Java\jdk1.8\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=49591:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\Environment\Java\jdk1.8\jre\lib\charsets.jar;E:\Environment\Java\jdk1.8\jre\lib\deploy.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\access-bridge-64.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\cldrdata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\dnsns.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jaccess.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jfxrt.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\localedata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\nashorn.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunec.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunjce_provider.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunmscapi.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunpkcs11.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\zipfs.jar;E:\Environment\Java\jdk1.8\jre\lib\javaws.jar;E:\Environment\Java\jdk1.8\jre\lib\jce.jar;E:\Environment\Java\jdk1.8\jre\lib\jfr.jar;E:\Environment\Java\jdk1.8\jre\lib\jfxswt.jar;E:\Environment\Java\jdk1.8\jre\lib\jsse.jar;E:\Environment\Java\jdk1.8\jre\lib\management-agent.jar;E:\Environment\Java\jdk1.8\jre\lib\plugin.jar;E:\Environment\Java\jdk1.8\jre\lib\resources.jar;E:\Environment\Java\jdk1.8\jre\lib\rt.jar;E:\IDEAcode\JavaSE\out\production\基础语法;E:\IDEAcode\JavaSE\基础语法\src\com\lib\commons-io-2.8.0.jar com.wzt.www.thread.syn.UnsafeBank
购房存款余额为:-50
女友手里的钱100
购房存款余额为:-50
你手里的钱50

Process finished with exit code 0

线程不安全

package com.wzt.www.thread.syn;

import java.util.ArrayList;
import java.util.List;

/**
 * @author WZT
 * @create 2021-03-31 15:33
 */
public class UnsafeList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            new Thread(()->{
                list.add(Thread.currentThread().getName());
            }).start();
        }
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(list.size());
    }
}
====================------------------------==================E:\Environment\Java\jdk1.8\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=49608:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\Environment\Java\jdk1.8\jre\lib\charsets.jar;E:\Environment\Java\jdk1.8\jre\lib\deploy.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\access-bridge-64.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\cldrdata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\dnsns.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jaccess.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jfxrt.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\localedata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\nashorn.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunec.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunjce_provider.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunmscapi.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunpkcs11.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\zipfs.jar;E:\Environment\Java\jdk1.8\jre\lib\javaws.jar;E:\Environment\Java\jdk1.8\jre\lib\jce.jar;E:\Environment\Java\jdk1.8\jre\lib\jfr.jar;E:\Environment\Java\jdk1.8\jre\lib\jfxswt.jar;E:\Environment\Java\jdk1.8\jre\lib\jsse.jar;E:\Environment\Java\jdk1.8\jre\lib\management-agent.jar;E:\Environment\Java\jdk1.8\jre\lib\plugin.jar;E:\Environment\Java\jdk1.8\jre\lib\resources.jar;E:\Environment\Java\jdk1.8\jre\lib\rt.jar;E:\IDEAcode\JavaSE\out\production\基础语法;E:\IDEAcode\JavaSE\基础语法\src\com\lib\commons-io-2.8.0.jar com.wzt.www.thread.syn.UnsafeList
9999

Process finished with exit code 0

20、CopyOnWriteArrayList

这个线程是安全的

package com.wzt.www.thread.syn;

import java.util.concurrent.CopyOnWriteArrayList;

/**
 * @author WZT
 * @create 2021-03-31 16:35
 */
//测试JUC安全类型集合
public class TestJUC {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();
        for (int i = 0; i < 10000; i++) {
            new Thread(()->{
                list.add(Thread.currentThread().getName());
            }).start();

        }

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(list.size());
    }
}
======================================
10000

21、死锁

在这里插入图片描述
在这里插入图片描述

//死锁:多个线程相互抱着对方需要的资源,然后形成僵持
public class DeadLock {
    public static void main(String[] args) {
        MakeUp g1 = new MakeUp(0, "tym");
        MakeUp g2 = new MakeUp(1, "dai");
        g1.start();
        g2.start();
    }
}

//口红
class Lipstick{

}

//镜子
class Mirror{

}

class MakeUp extends Thread {
    //需要的资源只有一份,用static来保证只有一份
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();

    int choice;//选择
    String girlName;//使用化妆品的人

    MakeUp(int choice, String girlName) {
        this.choice = choice;
        this.girlName = girlName;
    }

    @Override
    public void run() {
        try {
            makeup();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //化妆,相互持有对方的锁,就是需要拿到对方的资源
    private void makeup() throws InterruptedException {
        if (choice == 0) {
            synchronized (lipstick) {//获得口红的锁
                System.out.println(this.girlName + "获得口红的锁");
                Thread.sleep(1000);
                }
            synchronized (mirror) {//一秒钟后想获得镜子
                System.out.println(this.girlName + "获得镜子的锁");只有将请求另一把锁的需求放置在原来的锁释放之后才能不会造成死锁的情况
            }
        } else {
            synchronized (mirror) {
                System.out.println(this.girlName + "获得镜子的锁");
                Thread.sleep(1000);
                }
            synchronized (lipstick) {
                System.out.println(this.girlName + "获得口红的锁");
            }
        }
    }
}
=============================================================================
tym获得口红的锁
dai获得镜子的锁
dai获得口红的锁
tym获得镜子的锁

22、Lock锁

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.wzt.www.thread.demo05;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @author WZT
 * @create 2021-03-31 21:59
 */
public class TestLock {
    public static void main(String[] args) {
        TestLock2 testLock2 = new TestLock2();
        new Thread(testLock2).start();
        new Thread(testLock2).start();
        new Thread(testLock2).start();
    }
}

    class TestLock2 implements Runnable{
        int nums = 10;
        //定义lock锁
        private final ReentrantLock lock = new ReentrantLock();
        @Override
        public void run() {
            while (true){
                try {
                    lock.lock();//加锁
                    if (nums>0){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(nums--);
                    }else {
                        break;
                    }
                }finally {
                 lock.unlock();//解锁
                }

        }
    }
}
=========================================================
10
9
8
7
6
5
4
3
2
1

23、生产者消费者问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

24、管程法

package com.wzt.www.gaoji;

/**
 * @author WZT
 * @create 2021-04-01 10:01
 */
//测试:生产者消费者模型--->利用缓冲区解决:管程法
//生产者,消费者,缓冲区
public class TestPC {
    public static void main(String[] args) {
        SynContainer container = new SynContainer();
        new Productor(container).start();
        new Consumer(container).start();
    }
}

//生产者
class Productor extends Thread{
    SynContainer container;
    public Productor(SynContainer container){
        this.container = container;
    }
    //生产

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            container.push(new Chicken(i));
            System.out.println("生产了"+i+"只鸡");
        }
    }
}

//消费者
class Consumer extends Thread {
    SynContainer container;

    public Consumer(SynContainer container) {
        this.container = container;
    }
    //消费

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("消费了-->"+container.pop().id+"只鸡");
        }
    }
}

//产品
class Chicken{
    int id;

    public Chicken(int id){
        this.id = id;
    }
}

//缓冲区
class SynContainer {
    //需要一个容器的大小
    Chicken[] chickens = new Chicken[10];
    //容器计数器
    int count = 0;

    //生产者放入产品
    public synchronized void push(Chicken chicken) {
        //如果容器满了就需要等待消费者消费
        if (count == chickens.length) {
            //通知消费者消费,生产等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //如果容器没有满,我们就需要丢入产品
        chickens[count] = chicken;
        count++;
        //可以通知消费者消费
        this.notifyAll();
    }


    //消费者消费产品
    public synchronized Chicken pop() {
        //判断能否消费
        if (count == 0) {
            //等待生产者生产,消费者等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
            //如果可以消费
            count--;
            Chicken chicken = chickens[count];
            //吃完了,通知生产者生产
        this.notifyAll();
            return chicken;
        }
    }
    ======================================================================================
    E:\Environment\Java\jdk1.8\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=56525:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\Environment\Java\jdk1.8\jre\lib\charsets.jar;E:\Environment\Java\jdk1.8\jre\lib\deploy.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\access-bridge-64.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\cldrdata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\dnsns.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jaccess.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jfxrt.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\localedata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\nashorn.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunec.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunjce_provider.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunmscapi.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunpkcs11.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\zipfs.jar;E:\Environment\Java\jdk1.8\jre\lib\javaws.jar;E:\Environment\Java\jdk1.8\jre\lib\jce.jar;E:\Environment\Java\jdk1.8\jre\lib\jfr.jar;E:\Environment\Java\jdk1.8\jre\lib\jfxswt.jar;E:\Environment\Java\jdk1.8\jre\lib\jsse.jar;E:\Environment\Java\jdk1.8\jre\lib\management-agent.jar;E:\Environment\Java\jdk1.8\jre\lib\plugin.jar;E:\Environment\Java\jdk1.8\jre\lib\resources.jar;E:\Environment\Java\jdk1.8\jre\lib\rt.jar;E:\IDEAcode\JavaSE\out\production\基础语法;E:\IDEAcode\JavaSE\基础语法\src\com\lib\commons-io-2.8.0.jar com.wzt.www.gaoji.TestPC
生产了0只鸡
生产了1只鸡
生产了2只鸡
生产了3只鸡
生产了4只鸡
生产了5只鸡
生产了6只鸡
生产了7只鸡
生产了8只鸡
生产了9只鸡
消费了-->9只鸡
消费了-->10只鸡
消费了-->8只鸡
消费了-->7只鸡
生产了10只鸡
消费了-->6只鸡
消费了-->11只鸡
消费了-->5只鸡
消费了-->4只鸡
消费了-->3只鸡
生产了11只鸡
消费了-->2只鸡
生产了12只鸡
消费了-->12只鸡
生产了13只鸡
消费了-->13只鸡
消费了-->14只鸡
消费了-->1只鸡
消费了-->0只鸡
生产了14只鸡
消费了-->15只鸡
生产了15只鸡
生产了16只鸡
生产了17只鸡
生产了18只鸡
生产了19只鸡
生产了20只鸡
生产了21只鸡
生产了22只鸡
生产了23只鸡
生产了24只鸡
生产了25只鸡
生产了26只鸡
消费了-->16只鸡
消费了-->26只鸡
消费了-->25只鸡
生产了27只鸡
消费了-->27只鸡
生产了28只鸡
消费了-->28只鸡
生产了29只鸡
消费了-->29只鸡
生产了30只鸡
消费了-->30只鸡
生产了31只鸡
消费了-->31只鸡
消费了-->32只鸡
生产了32只鸡
消费了-->24只鸡
生产了33只鸡
消费了-->33只鸡
生产了34只鸡
生产了35只鸡
生产了36只鸡
生产了37只鸡
消费了-->34只鸡
消费了-->37只鸡
消费了-->38只鸡
消费了-->36只鸡
消费了-->35只鸡
消费了-->23只鸡
消费了-->22只鸡
消费了-->21只鸡
消费了-->20只鸡
消费了-->19只鸡
消费了-->18只鸡
消费了-->17只鸡
生产了38只鸡
生产了39只鸡
生产了40只鸡
生产了41只鸡
生产了42只鸡
生产了43只鸡
生产了44只鸡
生产了45只鸡
生产了46只鸡
生产了47只鸡
生产了48只鸡
生产了49只鸡
消费了-->39只鸡
消费了-->49只鸡
生产了50只鸡
消费了-->50只鸡
消费了-->51只鸡
消费了-->48只鸡
消费了-->47只鸡
消费了-->46只鸡
消费了-->45只鸡
消费了-->44只鸡
消费了-->43只鸡
消费了-->42只鸡
消费了-->41只鸡
消费了-->40只鸡
生产了51只鸡
生产了52只鸡
消费了-->52只鸡
生产了53只鸡
消费了-->53只鸡
消费了-->54只鸡
生产了54只鸡
生产了55只鸡
生产了56只鸡
生产了57只鸡
生产了58只鸡
消费了-->55只鸡
生产了59只鸡
消费了-->59只鸡
生产了60只鸡
消费了-->60只鸡
生产了61只鸡
消费了-->61只鸡
生产了62只鸡
消费了-->62只鸡
生产了63只鸡
消费了-->63只鸡
生产了64只鸡
消费了-->64只鸡
消费了-->65只鸡
生产了65只鸡
消费了-->58只鸡
生产了66只鸡
消费了-->66只鸡
生产了67只鸡
消费了-->67只鸡
生产了68只鸡
消费了-->68只鸡
生产了69只鸡
消费了-->69只鸡
生产了70只鸡
生产了71只鸡
生产了72只鸡
生产了73只鸡
生产了74只鸡
生产了75只鸡
生产了76只鸡
生产了77只鸡
生产了78只鸡
消费了-->70只鸡
消费了-->78只鸡
消费了-->79只鸡
消费了-->77只鸡
消费了-->76只鸡
消费了-->75只鸡
生产了79只鸡
消费了-->74只鸡
消费了-->80只鸡
消费了-->73只鸡
消费了-->72只鸡
消费了-->71只鸡
消费了-->57只鸡
消费了-->56只鸡
生产了80只鸡
生产了81只鸡
生产了82只鸡
生产了83只鸡
生产了84只鸡
生产了85只鸡
生产了86只鸡
生产了87只鸡
生产了88只鸡
消费了-->81只鸡
生产了89只鸡
生产了90只鸡
生产了91只鸡
生产了92只鸡
消费了-->89只鸡
消费了-->92只鸡
消费了-->93只鸡
消费了-->91只鸡
消费了-->90只鸡
消费了-->88只鸡
消费了-->87只鸡
消费了-->86只鸡
消费了-->85只鸡
消费了-->84只鸡
消费了-->83只鸡
消费了-->82只鸡
生产了93只鸡
生产了94只鸡
生产了95只鸡
生产了96只鸡
生产了97只鸡
消费了-->94只鸡
生产了98只鸡
消费了-->98只鸡
生产了99只鸡
消费了-->99只鸡
消费了-->97只鸡
消费了-->96只鸡
消费了-->95只鸡

Process finished with exit code 0


25、信号灯法

package com.wzt.www.gaoji;

/**
 * @author WZT
 * @create 2021-04-01 14:08
 */
//测试生产者消费者问题2:信号灯法,标志位解决
public class TestPC2 {
    public static void main(String[] args) {
        TV tv = new TV();
        new Player(tv).start();
        new Watcher(tv).start();
    }
}

//生产者--》演员
class Player extends Thread{
    TV tv;
    public Player(TV tv){
        this.tv = tv;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            if (i%2==0){
                this.tv.play("动物世界");
            }else {
                this.tv.play("人与自然");
            }
        }
    }
}

//消费者--》观众
class Watcher extends Thread{
    TV tv;
    public Watcher(TV tv) {
        this.tv = tv;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            this.tv.watch();
        }
    }
}

//产品--》节目
class TV{
    //演员表演,观众等待 T
    //观众观看,演员等待 F
    String voice;//表演的节目
    boolean flag = true;
    //表演
    public synchronized void play(String voice){
        if(!flag){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("演员表演了:"+voice);
        //通知观众观看

        this.notifyAll();//通知唤醒
        this.voice = voice;
        this.flag = !this.flag;
    }

    //观看
    public synchronized void watch(){
        if (flag){
            try {
                this.wait();
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        System.out.println("观众观看了:"+voice);
        //通知演员表演
        this.notifyAll();
        this.flag = !this.flag;
    }

}
========================================================================
E:\Environment\Java\jdk1.8\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=57725:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\Environment\Java\jdk1.8\jre\lib\charsets.jar;E:\Environment\Java\jdk1.8\jre\lib\deploy.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\access-bridge-64.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\cldrdata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\dnsns.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jaccess.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jfxrt.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\localedata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\nashorn.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunec.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunjce_provider.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunmscapi.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunpkcs11.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\zipfs.jar;E:\Environment\Java\jdk1.8\jre\lib\javaws.jar;E:\Environment\Java\jdk1.8\jre\lib\jce.jar;E:\Environment\Java\jdk1.8\jre\lib\jfr.jar;E:\Environment\Java\jdk1.8\jre\lib\jfxswt.jar;E:\Environment\Java\jdk1.8\jre\lib\jsse.jar;E:\Environment\Java\jdk1.8\jre\lib\management-agent.jar;E:\Environment\Java\jdk1.8\jre\lib\plugin.jar;E:\Environment\Java\jdk1.8\jre\lib\resources.jar;E:\Environment\Java\jdk1.8\jre\lib\rt.jar;E:\IDEAcode\JavaSE\out\production\基础语法;E:\IDEAcode\JavaSE\基础语法\src\com\lib\commons-io-2.8.0.jar com.wzt.www.gaoji.TestPC2
演员表演了:动物世界
观众观看了:动物世界
演员表演了:人与自然
观众观看了:人与自然
演员表演了:动物世界
观众观看了:动物世界
演员表演了:人与自然
观众观看了:人与自然
演员表演了:动物世界
观众观看了:动物世界
演员表演了:人与自然
观众观看了:人与自然
演员表演了:动物世界
观众观看了:动物世界
演员表演了:人与自然
观众观看了:人与自然
演员表演了:动物世界
观众观看了:动物世界
演员表演了:人与自然
观众观看了:人与自然
演员表演了:动物世界
观众观看了:动物世界
演员表演了:人与自然
观众观看了:人与自然
演员表演了:动物世界
观众观看了:动物世界
演员表演了:人与自然
观众观看了:人与自然
演员表演了:动物世界
观众观看了:动物世界
演员表演了:人与自然
观众观看了:人与自然
演员表演了:动物世界
观众观看了:动物世界
演员表演了:人与自然
观众观看了:人与自然
演员表演了:动物世界
观众观看了:动物世界
演员表演了:人与自然
观众观看了:人与自然

Process finished with exit code 0

26、线程池

在这里插入图片描述
在这里插入图片描述

package com.wzt.www.gaoji;

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author WZT
 * @create 2021-04-01 14:53
 */
//测试线程池
public class TestPool {
    public static void main(String[] args) {
        //1、创建服务,创建线程池
        //newFixedThreadPool 参数为:线程池大小
        ExecutorService service = Executors.newFixedThreadPool(10);
        //执行
        service.execute(new Mythread());
        service.execute(new Mythread());
        service.execute(new Mythread());
        service.execute(new Mythread());

        //2、关闭连接
        service.shutdown();
    }
}

class Mythread implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}
======================================================================
E:\Environment\Java\jdk1.8\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=58631:D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\Environment\Java\jdk1.8\jre\lib\charsets.jar;E:\Environment\Java\jdk1.8\jre\lib\deploy.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\access-bridge-64.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\cldrdata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\dnsns.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jaccess.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\jfxrt.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\localedata.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\nashorn.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunec.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunjce_provider.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunmscapi.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\sunpkcs11.jar;E:\Environment\Java\jdk1.8\jre\lib\ext\zipfs.jar;E:\Environment\Java\jdk1.8\jre\lib\javaws.jar;E:\Environment\Java\jdk1.8\jre\lib\jce.jar;E:\Environment\Java\jdk1.8\jre\lib\jfr.jar;E:\Environment\Java\jdk1.8\jre\lib\jfxswt.jar;E:\Environment\Java\jdk1.8\jre\lib\jsse.jar;E:\Environment\Java\jdk1.8\jre\lib\management-agent.jar;E:\Environment\Java\jdk1.8\jre\lib\plugin.jar;E:\Environment\Java\jdk1.8\jre\lib\resources.jar;E:\Environment\Java\jdk1.8\jre\lib\rt.jar;E:\IDEAcode\JavaSE\out\production\基础语法;E:\IDEAcode\JavaSE\基础语法\src\com\lib\commons-io-2.8.0.jar com.wzt.www.gaoji.TestPool
pool-1-thread-2
pool-1-thread-4
pool-1-thread-3
pool-1-thread-1

Process finished with exit code 0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仙谢郭嘉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值