-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
1972 lines (1108 loc) · 148 KB
/
index.html
File metadata and controls
1972 lines (1108 loc) · 148 KB
1
2
3
4
5
6
7
8
9
10
11
12
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!doctype html>
<html class="theme-next pisces use-motion">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<link href="/vendors/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css"/>
<link href="//fonts.googleapis.com/css?family=Lato:300,400,700,400italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
<link href="/vendors/font-awesome/css/font-awesome.min.css?v=4.4.0" rel="stylesheet" type="text/css" />
<link href="/css/main.css?v=0.5.0" rel="stylesheet" type="text/css" />
<meta name="keywords" content="Hexo, NexT" />
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=0.5.0" />
<meta name="description" content="想到什么就写什么">
<meta property="og:type" content="website">
<meta property="og:title" content="Ddragon's blog">
<meta property="og:url" content="http://DdragonEver.github.io/index.html">
<meta property="og:site_name" content="Ddragon's blog">
<meta property="og:description" content="想到什么就写什么">
<meta property="og:locale" content="zh-Hans">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Ddragon's blog">
<meta name="twitter:description" content="想到什么就写什么">
<script type="text/javascript" id="hexo.configuration">
var NexT = window.NexT || {};
var CONFIG = {
scheme: 'Pisces',
sidebar: {"position":"left","display":"post"},
fancybox: true,
motion: true,
duoshuo: {
userId: 0,
author: '博主'
}
};
</script>
<title> Ddragon's blog </title>
</head>
<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">
<script type="text/javascript">
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "//hm.baidu.com/hm.js?009bb473fb966b665a58eec49a7a6dfc";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<div class="container one-collumn sidebar-position-left
page-home
">
<div class="headband"></div>
<header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
<div class="header-inner"><div class="site-meta ">
<div class="custom-logo-site-title">
<a href="/" class="brand" rel="start">
<span class="logo-line-before"><i></i></span>
<span class="site-title">Ddragon's blog</span>
<span class="logo-line-after"><i></i></span>
</a>
</div>
<p class="site-subtitle">coding</p>
</div>
<div class="site-nav-toggle">
<button>
<span class="btn-bar"></span>
<span class="btn-bar"></span>
<span class="btn-bar"></span>
</button>
</div>
<nav class="site-nav">
<ul id="menu" class="menu ">
<li class="menu-item menu-item-home">
<a href="/" rel="section">
<i class="menu-item-icon fa fa-home fa-fw"></i> <br />
首页
</a>
</li>
<li class="menu-item menu-item-categories">
<a href="/categories" rel="section">
<i class="menu-item-icon fa fa-th fa-fw"></i> <br />
分类
</a>
</li>
<li class="menu-item menu-item-about">
<a href="/about" rel="section">
<i class="menu-item-icon fa fa-user fa-fw"></i> <br />
关于
</a>
</li>
<li class="menu-item menu-item-archives">
<a href="/archives" rel="section">
<i class="menu-item-icon fa fa-archive fa-fw"></i> <br />
归档
</a>
</li>
<li class="menu-item menu-item-tags">
<a href="/tags" rel="section">
<i class="menu-item-icon fa fa-tags fa-fw"></i> <br />
标签
</a>
</li>
</ul>
</nav>
</div>
</header>
<main id="main" class="main">
<div class="main-inner">
<div class="content-wrap">
<div id="content" class="content">
<section id="posts" class="posts-expand">
<article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link" href="/2018/09/10/Java-servlet/" itemprop="url">
Java servlet
</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time itemprop="dateCreated" datetime="2018-09-10T10:00:25Z" content="2018-09-10">
2018-09-10
</time>
</span>
<span class="post-comments-count">
|
<a href="/2018/09/10/Java-servlet/#comments" itemprop="discussionUrl">
<span class="post-comments-count ds-thread-count" data-thread-key="2018/09/10/Java-servlet/" itemprop="commentsCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="容器和Java-web"><a href="#容器和Java-web" class="headerlink" title="容器和Java web"></a>容器和Java web</h1><h4 id="一、java-web容器规范"><a href="#一、java-web容器规范" class="headerlink" title="一、java web容器规范"></a>一、java web容器规范</h4><h5 id="1、概念"><a href="#1、概念" class="headerlink" title="1、概念"></a>1、概念</h5><ul>
<li>web容器是能部署web应用程序的环境</li>
<li>Tomcat容器是Java Servlet,JavaServer Pages,Java Expression Language和Java WebSocket(Java EE)技术实现</li>
<li>Servlet是主要作用是给上级容器(Tomcat)等提供doGet()和doPost()等方法。其生命周期实例化、初始化、调用、销毁受控于Tomcat容器</li>
<li>Java Web应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种web容器(如Tomcat)中运行。</li>
</ul>
<h4 id="二、Servlet"><a href="#二、Servlet" class="headerlink" title="二、Servlet"></a>二、Servlet</h4><ul>
<li>Servlet本质上市一个java类,按照规范可以在javaweb容器中运行,对客户端的请求做出响应。</li>
</ul>
<h5 id="2-1、Servlet的生命周期"><a href="#2-1、Servlet的生命周期" class="headerlink" title="2.1、Servlet的生命周期"></a>2.1、Servlet的生命周期</h5><ul>
<li>init()初始化,数据初始化 </li>
<li>service()方法处理请求调用的实际方法,请求后把结果返回给客户端,service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。</li>
<li>destory()方法结束请求</li>
</ul>
<figure class="highlight aspectj"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"> <span class="comment">//service方法调用特征</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> service(ServletRequest request, </span><br><span class="line"> ServletResponse response) </span><br><span class="line"> <span class="keyword">throws</span> ServletException, IOException{</span><br><span class="line">}</span><br><span class="line"> <span class="comment">//调用service之后常见的doGet doPost方法</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> doGet(HttpServletRequest request,</span><br><span class="line"> HttpServletResponse response)</span><br><span class="line"> <span class="keyword">throws</span> ServletException, IOException {</span><br><span class="line"> <span class="comment">// 处理</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h5 id="2-2、Servlet-demo"><a href="#2-2、Servlet-demo" class="headerlink" title="2.2、Servlet demo"></a>2.2、Servlet demo</h5><ul>
<li><p>流程</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"> <span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.*;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.*;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">SampileServlet</span> <span class="keyword">extends</span> <span class="title">HttpServlet</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String message;</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">init</span><span class="params">()</span> <span class="keyword">throws</span> ServletException</span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="comment">// 执行必需的初始化</span></span><br><span class="line"> message = <span class="string">" sample"</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">doGet</span><span class="params">(HttpServletRequest request,</span></span></span><br><span class="line"><span class="function"><span class="params"> HttpServletResponse response)</span></span></span><br><span class="line"><span class="function"> <span class="keyword">throws</span> ServletException, IOException</span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="comment">// 设置响应内容类型</span></span><br><span class="line"> response.setContentType(<span class="string">"text/html"</span>);</span><br><span class="line"> <span class="comment">// 实际的逻辑是在这里</span></span><br><span class="line"> PrintWriter out = response.getWriter();</span><br><span class="line"> out.println(<span class="string">"<h1>"</span> + message + <span class="string">"</h1>"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">destroy</span><span class="params">()</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
<li><p>在路由层配置url映射关系,类似于spring中的RequestMapping,Python flaskweb框架中的@app.route(“/index.html”)功能</p>
</li>
</ul>
<figure class="highlight dts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="params"><web-app></span> </span><br><span class="line"><span class="params"><servlet></span></span><br><span class="line"><span class="params"><description></span><span class="params"></description></span></span><br><span class="line"><span class="params"><display-name></span>HelloServlet<span class="params"></display-name></span></span><br><span class="line"><span class="params"><servlet-name></span>HelloServlet<span class="params"></servlet-name></span></span><br><span class="line"><span class="params"><jsp-file></span>/servlet.jsp<span class="params"></jsp-file></span></span><br><span class="line"><span class="params"></servlet></span></span><br><span class="line"> <span class="params"><servlet-mapping></span></span><br><span class="line"> <span class="params"><servlet-name></span>HelloServlet<span class="params"></servlet-name></span></span><br><span class="line"> <span class="params"><url-pattern></span><span class="meta-keyword">/servlet/</span>HelloServlet<span class="params"></url-pattern></span></span><br><span class="line"><span class="params"></servlet-mapping></span></span><br><span class="line"><span class="params"><servlet></span></span><br><span class="line"><span class="params"></web-app></span></span><br></pre></td></tr></table></figure>
<h4 id="三、Cookie和Session"><a href="#三、Cookie和Session" class="headerlink" title="三、Cookie和Session"></a>三、Cookie和Session</h4><ul>
<li>Session保存在服务端,主要是服务端了标识用户而产生的,用于会话跟踪。</li>
<li>Cookie,cookie是客户端发送给服务端的,session的跟踪主要也是用cookie来实现的。cookie信息一般保存在http报文信息中。</li>
<li>在jsp中,有Cookie对象供用户调用,可以设置服务端需要的key和value</li>
</ul>
<figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">Cookie cookie</span> = new Cookie(<span class="string">"key"</span>,<span class="string">"value"</span>);</span><br></pre></td></tr></table></figure>
<h4 id="四、JSP"><a href="#四、JSP" class="headerlink" title="四、JSP"></a>四、JSP</h4><ul>
<li>Java server pages一种根据服务端数据动态生成界面的技术,和很多前端模板引擎类似,jsp是一个servle程序。在界面中写入很多控制代码,来实现数据的动态渲染,之前学习过jinja2类似的模板引起,语法非常像。</li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link" href="/2018/09/10/反射注解与动态代理/" itemprop="url">
反射注解与动态代理
</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time itemprop="dateCreated" datetime="2018-09-10T10:00:01Z" content="2018-09-10">
2018-09-10
</time>
</span>
<span class="post-comments-count">
|
<a href="/2018/09/10/反射注解与动态代理/#comments" itemprop="discussionUrl">
<span class="post-comments-count ds-thread-count" data-thread-key="2018/09/10/反射注解与动态代理/" itemprop="commentsCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="反射,注解和动态代理,类加载"><a href="#反射,注解和动态代理,类加载" class="headerlink" title="反射,注解和动态代理,类加载"></a>反射,注解和动态代理,类加载</h1><h4 id="一、反射"><a href="#一、反射" class="headerlink" title="一、反射"></a>一、反射</h4><h5 id="1、概念"><a href="#1、概念" class="headerlink" title="1、概念"></a>1、概念</h5><ul>
<li>java的反射机制指的是程序在运行过程中,对于类,能获取到类的属性和方法,对于对象,能够调用他的属性和方法,动态的获取数据。</li>
</ul>
<h5 id="1、获取类的属性和方法"><a href="#1、获取类的属性和方法" class="headerlink" title="1、获取类的属性和方法"></a>1、获取类的属性和方法</h5><ul>
<li>假设有一个Student类,</li>
</ul>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * class</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Student</span> {</span></span><br><span class="line"> <span class="keyword">public</span> String name;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">doHomeWork</span><span class="params">()</span></span>{</span><br><span class="line"> <span class="comment">//do something</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>获取类名和属性</li>
</ul>
<figure class="highlight monkey"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.lang.reflect.<span class="keyword">Field</span>;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Main</span> {</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> static void main(String[] args) {</span><br><span class="line"> <span class="class"><span class="keyword">Class</span> <span class="title">stuClass</span> = <span class="title">Student</span>.<span class="title">class</span>;</span></span><br><span class="line"> System.out.println(stuClass.getName());</span><br><span class="line"> <span class="keyword">Field</span>[] fields = stuClass.getFields();</span><br><span class="line"> <span class="function"><span class="keyword">Method</span>[] <span class="title">methods</span> =</span> stuClass.getMethods();</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">Field</span> <span class="keyword">field</span> : fields){</span><br><span class="line"> System.out.println(<span class="keyword">field</span>.getName());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="function"><span class="keyword">Method</span> <span class="title">method</span> :</span> methods){</span><br><span class="line"> System.out.println(<span class="function"><span class="keyword">method</span>.<span class="title">getName</span>(</span>));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>此外,也可以访问私有方法,通过 class.getDeclaredMethod(“privateMethod”, String.class, int.class)可以获取。</li>
</ul>
<h4 id="二、注解"><a href="#二、注解" class="headerlink" title="二、注解"></a>二、注解</h4><ul>
<li>注解可以使得Java源代码中可以添加功能性的实现代码,还可以添加元数据,和类于接口一样,注解也属于一种类型,使用@interface进行标记,比如定义一个Hello注解</li>
</ul>
<figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">import</span> <span class="selector-tag">java</span><span class="selector-class">.lang</span><span class="selector-class">.annotation</span><span class="selector-class">.ElementType</span>;</span><br><span class="line"><span class="selector-tag">import</span> <span class="selector-tag">java</span><span class="selector-class">.lang</span><span class="selector-class">.annotation</span><span class="selector-class">.Retention</span>;</span><br><span class="line"><span class="selector-tag">import</span> <span class="selector-tag">java</span><span class="selector-class">.lang</span><span class="selector-class">.annotation</span><span class="selector-class">.RetentionPolicy</span>;</span><br><span class="line"><span class="selector-tag">import</span> <span class="selector-tag">java</span><span class="selector-class">.lang</span><span class="selector-class">.annotation</span><span class="selector-class">.Target</span>;</span><br><span class="line"></span><br><span class="line">@<span class="keyword">Retention</span>(<span class="keyword">RetentionPolicy</span>.<span class="keyword">RUNTIME</span>)</span><br><span class="line">@<span class="keyword">Target</span>(<span class="keyword">ElementType</span>.<span class="keyword">METHOD</span>)</span><br><span class="line"><span class="keyword">public</span> @interface Hello {</span><br><span class="line"> </span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>使用场景,当类,属性和对象标记注解以后,注解的信息提取使用java反射的形式,主要给编译器以及工具类型的软件使用。</li>
</ul>
<h5 id="2-1-元注解"><a href="#2-1-元注解" class="headerlink" title="2.1 元注解"></a>2.1 元注解</h5><ul>
<li>元注解是标记注解的注解,元注解可以指明注解是做什么的,常用的有:</li>
<li>@Retention 注解的保留期,取值有RetentionPolicy.SOURCE(注解在源码期间保留), RetentionPolicy.CLASS(保留到编译进行的时候,不会加载进jvm) RetentionPolicy.RUNTIME(保留到程序运行时)</li>
<li>@Document 将注解的元素包含到java doc中</li>
<li>@Target 注解使用的地方,可以指定类,属性或者方法等,有较多选择</li>
<li>@Inherited 继承功能,当超类使用了这个注解,他的子类也会使用上这个注解。</li>
<li>@Repeatable 可重复</li>
</ul>
<h4 id="三、动态代理"><a href="#三、动态代理" class="headerlink" title="三、动态代理"></a>三、动态代理</h4><ul>
<li>代理模式,中间人模式,常见的场景是用户要做一件事情,不会自己亲自做,而是会让中介去做,帮自己实现,面向对象程序设计中很常见的设计模式。代理流程如下:<br><img src="https://s10.mogucdn.com/mlcdn/c45406/180910_09aggbed258jhcd6jac67350166f1_1542x324.jpg" alt=""></li>
<li>动态代理可以用来做方法的功能增强,对代码无侵入,动态代理使用Proxy的静态方法newProxyInstance动态创建代理,如下</li>
</ul>
<figure class="highlight delphi"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">Object</span> newProxyInstance(ClassLoader loader,<span class="comment">//类加载器</span></span><br><span class="line"> <span class="keyword">Class</span><?>[] interfaces, <span class="comment">//代理接口</span></span><br><span class="line"> InvocationHandler h)<span class="comment">//关联接口</span></span><br></pre></td></tr></table></figure>
<ul>
<li>要创建动态代理,核心是要实现InvocationHandler接口和invoke方法,比如,要为一个接口的功能实现进行日志打印,相关流程:</li>
</ul>
<figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//动态代理只能为接口创建代理</span></span><br><span class="line"><span class="keyword">interface</span> <span class="title">Work</span>{</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">getInfo</span>(<span class="params"></span>)</span>;</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">doWork</span>(<span class="params"></span>)</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">HomeWork</span> <span class="keyword">implements</span> <span class="title">Work</span></span>{</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">getInfo</span><span class="params">()</span></span>{</span><br><span class="line"> System.out.println(<span class="string">"收集资料"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">doWork</span><span class="params">()</span></span>{</span><br><span class="line"> System.out.println(<span class="string">"正式工作"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"> <span class="comment">//增强功能</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">class</span> <span class="title">WorkLog</span> {</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">log</span>(<span class="params"></span>)</span>{</span><br><span class="line"> System.<span class="keyword">out</span>.println(<span class="string">"工作记录......"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<figure class="highlight aspectj"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.lang.reflect.InvocationHandler;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">WorkInvocationHandler</span> <span class="keyword">implements</span> <span class="title">InvocationHandler</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Object <span class="keyword">target</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">void</span> <span class="title">setTarget</span><span class="params">(Object <span class="keyword">target</span>)</span></span>{</span><br><span class="line"> <span class="keyword">this</span>.<span class="keyword">target</span> = <span class="keyword">target</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//注意抛出异常,实现invoke方法</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function">Object <span class="title">invoke</span><span class="params">(Object proxy, Method method, Object[] args)</span> <span class="keyword">throws</span> Throwable</span>{</span><br><span class="line"> WorkLog workLog = <span class="keyword">new</span> WorkLog();</span><br><span class="line"> workLog.log();</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">return</span> method.<span class="title">invoke</span><span class="params">(<span class="keyword">target</span>, args)</span></span>;</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<figure class="highlight aspectj"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"> <span class="keyword">import</span> java.lang.reflect.Proxy;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MyProxyFactory</span></span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="function">Object <span class="title">getProxy</span><span class="params">(Object <span class="keyword">target</span>)</span> <span class="keyword">throws</span> Exception</span>{</span><br><span class="line"> <span class="comment">// 实例化对象</span></span><br><span class="line"> WorkInvocationHandler <span class="keyword">handler</span> = <span class="keyword">new</span> WorkInvocationHandler();</span><br><span class="line"> <span class="keyword">handler</span>.setTarget(<span class="keyword">target</span>);</span><br><span class="line"> <span class="keyword">return</span> Proxy.newProxyInstance(<span class="keyword">target</span>.getClass().getClassLoader(),</span><br><span class="line"> <span class="keyword">target</span>.getClass().getInterfaces(),<span class="keyword">handler</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<figure class="highlight aspectj"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="function"><span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> <span class="comment">// 实例化一个被代理对象</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> Work <span class="keyword">target</span> = <span class="keyword">new</span> HomeWork();</span><br><span class="line"> Work work = (Work) MyProxyFactory.getProxy(<span class="keyword">target</span>);</span><br><span class="line"> work.getInfo();</span><br><span class="line"> work.doWork();</span><br><span class="line"> }<span class="keyword">catch</span> (Exception ignored){}</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p><img src="https://s10.mogucdn.com/mlcdn/c45406/180910_13cb2i6a3el5a98e0i1ec0jh0e141_1102x342.jpg" alt=""></p>
<h4 id="四、类加载机制"><a href="#四、类加载机制" class="headerlink" title="四、类加载机制"></a>四、类加载机制</h4><h5 id="1、概述"><a href="#1、概述" class="headerlink" title="1、概述"></a>1、概述</h5><ul>
<li>Java代码需要运行,首先需要将源代码进行编译生成 .class 文件,然后 JVM 加载 .class 字节码文件到内存,而 .class 文件是怎样被加载到 JVM 中的就是Java 类加载</li>
</ul>
<h5 id="2、分类"><a href="#2、分类" class="headerlink" title="2、分类"></a>2、分类</h5><ul>
<li>AppClassLoader 应用加载器,也称为系统加载器,会加载来自CLASSPATH中的类和包,默认情况下,其它类加载器会将它作为父类加载器</li>
<li>ExtClassloader 拓展类加载器,主要加载Java的拓展类库</li>
<li>BootStrapClassLoader 启动类加载器,是最顶层的父类加载器,主要用来加载java的核心类</li>
</ul>
<h5 id="3、加载过程"><a href="#3、加载过程" class="headerlink" title="3、加载过程"></a>3、加载过程</h5><ul>
<li>加载流程如下:<br><img src="https://s10.mogucdn.com/mlcdn/c45406/180910_47ccclakc5d8d9g7k68bb4dkbl5b3_1296x400.jpg" alt=""><ul>
<li>加载过程采用双亲委派模型,当一个类加载器收到类加载任务时,会有限交给父类处理,父类无法完成时才会尝试自行加载任务。保证了使用不同的类加载器最终得到的都是同一个对象。</li>
</ul>
</li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link" href="/2018/09/10/Java线程/" itemprop="url">
Java线程
</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time itemprop="dateCreated" datetime="2018-09-10T09:59:33Z" content="2018-09-10">
2018-09-10
</time>
</span>
<span class="post-comments-count">
|
<a href="/2018/09/10/Java线程/#comments" itemprop="discussionUrl">
<span class="post-comments-count ds-thread-count" data-thread-key="2018/09/10/Java线程/" itemprop="commentsCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="多线程"><a href="#多线程" class="headerlink" title="多线程"></a>多线程</h1><h3 id="一、概念"><a href="#一、概念" class="headerlink" title="一、概念"></a>一、概念</h3><h4 id="1、进程和线程的概念"><a href="#1、进程和线程的概念" class="headerlink" title="1、进程和线程的概念"></a>1、进程和线程的概念</h4><ul>
<li>进程和线程都是操作系统中的概念,操作系统对进程和线程的严格定义是:进程是具有一定独立功能的程序,是系统进行资源分配和调度的独立单位。线程是进程的实体,是cpu调度和分配的基本单位。</li>
</ul>
<h4 id="2、进程与线程的关系"><a href="#2、进程与线程的关系" class="headerlink" title="2、进程与线程的关系"></a>2、进程与线程的关系</h4><ul>
<li>一个线程只能属于一个进程,而一个进程可以有多个线程。 </li>
<li>同一进程的所有线程共享该进程的资源。 </li>
<li>线程在执行过程中,不同进程的线程间要利用消息通信的办法实现数据同步。 </li>
</ul>
<h4 id="3、线程的生命周期"><a href="#3、线程的生命周期" class="headerlink" title="3、线程的生命周期"></a>3、线程的生命周期</h4><ul>
<li>主要有创建,就绪,运行,阻塞,销毁几个状态,如图:</li>
</ul>
<p><img src="https://s10.mogucdn.com/mlcdn/c45406/180910_3c2dik9ehd52bc7hg4d10da13e7jb_1096x446.jpg" alt=""></p>
<h4 id="2、java与多线程"><a href="#2、java与多线程" class="headerlink" title="2、java与多线程"></a>2、java与多线程</h4><ul>
<li>java为了提升程序性能,也引入了多线程概念,通过多线程,在一些场景能极大提升性能,实现线程主要有两种方式,一种继承Thread类,另一种实现Runable接口,<h5 id="2-1-继承Thread类型"><a href="#2-1-继承Thread类型" class="headerlink" title="2.1 继承Thread类型"></a>2.1 继承Thread类型</h5></li>
<li>创建线程,可以通过继承Thread类并实现run()方法的形式,run()里面编写实际要运行的代码,运行时通过start()方法将线程设为可运行态,并不是直接执行,具体调用还是要操作系统决定。</li>
</ul>
<figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 继承Thread</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">public <span class="class"><span class="keyword">class</span> <span class="title">TestThread</span> <span class="keyword">extends</span> <span class="title">Thread</span></span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="type">String</span> threadName;</span><br><span class="line"></span><br><span class="line"> public <span class="type">TestThread</span>(<span class="type">String</span> name){</span><br><span class="line"> <span class="keyword">this</span>.threadName=name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> public void run(){</span><br><span class="line"> <span class="type">System</span>.out.print(threadName);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h5 id="2-2-实现Runnable接口"><a href="#2-2-实现Runnable接口" class="headerlink" title="2.2 实现Runnable接口"></a>2.2 实现Runnable接口</h5><ul>
<li>线程类通过实现Runnable接口,实现run()方法,也能实现线程调用,和继承Thread类类似,如下:</li>
</ul>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">RunnableThread</span> <span class="keyword">implements</span> <span class="title">Runnable</span></span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String threadName;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">RunnableThread</span><span class="params">(String name)</span></span>{</span><br><span class="line"> <span class="keyword">this</span>.threadName=name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span></span>{</span><br><span class="line"> System.out.println(threadName);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h5 id="2-3-详细的启动过程"><a href="#2-3-详细的启动过程" class="headerlink" title="2.3 详细的启动过程"></a>2.3 详细的启动过程</h5><ul>
<li>1、通过new创建一个线程对象</li>
<li>2、调用线程对象的start()方法,使线程处理Runnable可运行状态,等待调用</li>
<li>3、当被调用时,执行run()中的代码</li>
<li>4、当线程因为原因在运行时放弃cpu调用时(比如被优先级高的线程抢占),便会进入阻塞状态,当要继续运行时,需要重新进入可运行状态。</li>
<li>5、执行完成,会进入销毁状态。</li>
</ul>
<h4 id="3、线程同步"><a href="#3、线程同步" class="headerlink" title="3、线程同步"></a>3、线程同步</h4><ul>
<li>同一个进程的线程资源是共享的,当操作共享资源时,会存在问题,为了避免临界区造成的问题,线程之间需要进行同步,主要有下面几种同步方式</li>
</ul>
<h5 id="3-1、使用synchronized进行修饰"><a href="#3-1、使用synchronized进行修饰" class="headerlink" title="3.1、使用synchronized进行修饰"></a>3.1、使用synchronized进行修饰</h5><ul>
<li>在需要同步的方法面前加入synchronized进行修饰,synchronized会将对象锁住,能够保证在同一时刻只有一个线程访问,在调用方法之前,需要先获得内置锁,同时,除了修饰方法,还能修饰代码块</li>
</ul>
<figure class="highlight aspectj"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="function"><span class="keyword">synchronized</span> <span class="title">saveMoney</span><span class="params">()</span></span>{<span class="comment">//todo somethind};</span></span><br></pre></td></tr></table></figure>
<figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">synchronized(<span class="class"><span class="keyword">object</span>)</span>{}; <span class="comment">//修饰对象</span></span><br></pre></td></tr></table></figure>
<h5 id="3-2、使用Lock锁"><a href="#3-2、使用Lock锁" class="headerlink" title="3.2、使用Lock锁"></a>3.2、使用Lock锁</h5><ul>
<li>锁机制也能保证同一个时刻只能有一个线程进行访问,在在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock可重入锁等</li>
</ul>
<figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"> Lock l = ...; <span class="comment">//lock实现对象对象</span></span><br><span class="line">l.<span class="keyword">lock</span>();</span><br><span class="line"><span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//todo something</span></span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> l.unlock();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h5 id="3-3-volatile"><a href="#3-3-volatile" class="headerlink" title="3.3 volatile"></a>3.3 volatile</h5><ul>
<li>volatile主要保证了一个共享变量在多个线程访问的情况下,保证了共享变量的可见性,比如一个线程对变量进行了修改,另一个线程能同步到修改的值。</li>
</ul>
<h4 id="4、线程池"><a href="#4、线程池" class="headerlink" title="4、线程池"></a>4、线程池</h4><ul>
<li>在单个线程的使用中,频繁的创建销毁线程对象损耗较多的时间,影响系统性能,当有任务来时,临时创建性能也非常低效,节省了时间和效率。所以在多线程的开发中,尽量使用线程池的形式。</li>
</ul>
<h5 id="4-1、ThreadPoolExecutor"><a href="#4-1、ThreadPoolExecutor" class="headerlink" title="4.1、ThreadPoolExecutor"></a>4.1、ThreadPoolExecutor</h5><ul>
<li>使用ThreadPoolExecutor进行创建线程池,用法</li>
</ul>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">ThreadPoolExecutor</span><span class="params">(<span class="keyword">int</span> corePoolSize,</span></span></span><br><span class="line"><span class="function"><span class="params"> <span class="keyword">int</span> maximumPoolSize,</span></span></span><br><span class="line"><span class="function"><span class="params"> <span class="keyword">long</span> keepAliveTime,</span></span></span><br><span class="line"><span class="function"><span class="params"> TimeUnit unit,</span></span></span><br><span class="line"><span class="function"><span class="params"> BlockingQueue<Runnable> workQueue)</span> </span>{</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>corePoolSize是核心池的大小,maximumPoolSize最大线程数,keepAliveTime当没有任务时线程的存活时间,weekQueue阻塞队列,用来保存执行的任务,unit时间单位</li>
<li>协作流程:线程优先向 CorePool 中提交;在 Corepool 满了之后,线程被提交到任务队列,等待线程池空闲;在任务队列满了之后 corePool 还没有空闲,那么任务将被提交到 maxPool 中,如果 MaxPool 满了之后执行 task 拒绝策略。</li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link" href="/2018/09/10/Java集合框架/" itemprop="url">
Java集合框架
</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time itemprop="dateCreated" datetime="2018-09-10T09:59:25Z" content="2018-09-10">
2018-09-10
</time>
</span>
<span class="post-comments-count">
|
<a href="/2018/09/10/Java集合框架/#comments" itemprop="discussionUrl">
<span class="post-comments-count ds-thread-count" data-thread-key="2018/09/10/Java集合框架/" itemprop="commentsCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="Java集合框架"><a href="#Java集合框架" class="headerlink" title="Java集合框架"></a>Java集合框架</h1><h2 id="1、概述"><a href="#1、概述" class="headerlink" title="1、概述"></a>1、概述</h2><ul>
<li>java除了提供基本的数据类型支持外,还提供了对数据对象类型的存储框架,可以非常高效的,方便的操纵这些数据对象,并且能动态增长,集合可以用来存储、检索、操作、通信,它主要包含接口和实现类一些具体的操作方法。</li>
<li>java的集合框架主要有两种,一种是集合(Collection),集合是存储一类元素的结合,它是最基本的容器接口,继承了Iterable接口。另一种是图,它存储了键值对的映射关系,通过键能得到值。</li>
</ul>
<h2 id="2、Collection"><a href="#2、Collection" class="headerlink" title="2、Collection"></a>2、Collection</h2><ul>
<li>Collection接口有三种子类型,分别为List,Set和Queue,由抽象类到具体的实现类,常用的有<h4 id="1、List介绍"><a href="#1、List介绍" class="headerlink" title="1、List介绍"></a>1、List介绍</h4></li>
<li>List容器中的元素是有序可重复的,它能够控制每个元素的插入位置,用户还可以直接通过索引来进行访问。List的实现类还有LindedList,ArrayList,vector和stack.<h4 id="2、Set介绍"><a href="#2、Set介绍" class="headerlink" title="2、Set介绍"></a>2、Set介绍</h4></li>
<li>Set里面存储的元素都是不重复的,并且里面的元素是无序的</li>
</ul>
<h4 id="3、Queue介绍"><a href="#3、Queue介绍" class="headerlink" title="3、Queue介绍"></a>3、Queue介绍</h4><ul>
<li>队列继承了Collection接口,和List,Set是同一个级别的,只允许在一端进行插入操作,另一端进行删除操作。具有先进先出的特性</li>
</ul>
<h4 id="4、Map"><a href="#4、Map" class="headerlink" title="4、Map"></a>4、Map</h4><ul>
<li>在程序中用于管理映射关系</li>
<li>map里面的key和value是一一对应的,并且不允许里面的key重复</li>
<li>map里面最重要的有一个entry方法,里面定义了对key或者value的获取方法</li>
</ul>
<h5 id="4-1-HashMap"><a href="#4-1-HashMap" class="headerlink" title="4.1 HashMap"></a>4.1 HashMap</h5><ul>
<li>HashMap是最常用的map,存储根据键的hashCode来进行存储,根据键可以直接获取值,访问速度很快。</li>
<li>遍历方式:遍历方式有根据keySet()值遍历和entrySet()键值进行遍历,还有迭代器iterator()的遍历方式。</li>
<li>iterator()方法的遍历:</li>
</ul>
<figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"># 使用keySet进行遍历</span><br><span class="line"><span class="keyword">Iterator<String> </span><span class="keyword">iterator </span>= <span class="meta">map</span>.keySet().<span class="keyword">iterator();</span></span><br><span class="line"><span class="keyword">while </span>(<span class="keyword">iterator.hasNext()) </span>{</span><br><span class="line"> <span class="keyword">String </span>key = <span class="keyword">iterator.next();</span></span><br><span class="line"><span class="keyword"> </span> System.out.println(<span class="meta">map</span>.get(key))<span class="comment">;</span></span><br><span class="line">}</span><br><span class="line"># 使用entrySet()进行遍历</span><br><span class="line"><span class="keyword">Iterator<Map.Entry<String, </span><span class="keyword">String>> </span><span class="keyword">iterator </span>= <span class="meta">map</span>.entrySet().<span class="keyword">iterator();</span></span><br><span class="line"><span class="keyword">while </span>(<span class="keyword">iterator.hasNext()) </span>{</span><br><span class="line"> <span class="meta">Map</span>.Entry<<span class="keyword">String, </span><span class="keyword">String> </span><span class="meta">entry</span> = <span class="keyword">iterator.next();</span></span><br><span class="line"><span class="keyword"> </span> System.out.println(<span class="meta">entry</span>.getValue())<span class="comment">;</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="3、Iterator"><a href="#3、Iterator" class="headerlink" title="3、Iterator"></a>3、Iterator</h2><ul>
<li>iterator其实就是遍历,提供的标准化遍历容器内所有对象的方法,在迭代过程中,使用者不需要了解集合的内部的结构。</li>
<li>iterator主要有3个方法</li>
</ul>
<figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="title">hasNext</span><span class="params">()</span></span> <span class="comment">//判断是否还有元素供迭代</span></span><br><span class="line"><span class="function"><span class="title">next</span><span class="params">()</span></span> <span class="comment">//返回迭代的下一个元素</span></span><br><span class="line">remove() <span class="comment">//移除迭代器返回的最后一个元素</span></span><br></pre></td></tr></table></figure>
<h2 id="4、泛型"><a href="#4、泛型" class="headerlink" title="4、泛型"></a>4、泛型</h2><ul>
<li>泛型主要是为了解决代码被不同对象的类型重用的问题,在集合框架中有广泛的使用。</li>
</ul>
<h4 id="4-1-泛型类"><a href="#4-1-泛型类" class="headerlink" title="4.1 泛型类"></a>4.1 泛型类</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Pair</span><K, V> {</span></span><br><span class="line"> <span class="keyword">private</span> K key;</span><br><span class="line"> <span class="keyword">private</span> V value;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<h4 id="4-2-泛型方法"><a href="#4-2-泛型方法" class="headerlink" title="4.2 泛型方法"></a>4.2 泛型方法</h4><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"> <span class="keyword">public</span> Class A{</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <T><span class="function">T <span class="title">test</span><span class="params">(T t)</span></span>{</span><br><span class="line"> <span class="keyword">return</span> t;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <T> <span class="function"><span class="keyword">void</span> <span class="title">hi</span><span class="params">(T t)</span></span>{</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h4 id="4-3-类型限定"><a href="#4-3-类型限定" class="headerlink" title="4.3 类型限定"></a>4.3 类型限定</h4><ul>
<li>需要限制类型时使用 extends</li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link" href="/2017/03/03/Python函数式编程/" itemprop="url">
Python函数式编程
</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time itemprop="dateCreated" datetime="2017-03-02T22:12:09Z" content="2017-03-02">
2017-03-02
</time>
</span>
<span class="post-category" >
|
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="https://schema.org/Thing">
<a href="/categories/python/" itemprop="url" rel="index">
<span itemprop="name">python</span>
</a>
</span>
</span>
<span class="post-comments-count">
|
<a href="/2017/03/03/Python函数式编程/#comments" itemprop="discussionUrl">
<span class="post-comments-count ds-thread-count" data-thread-key="2017/03/03/Python函数式编程/" itemprop="commentsCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h3 id="1、Haskell到python函数式编程"><a href="#1、Haskell到python函数式编程" class="headerlink" title="1、Haskell到python函数式编程"></a>1、Haskell到python函数式编程</h3><p> 在学习python的过程中,一直体会着它的简洁和优雅,也钟情于它的简洁和优雅。但在一次偶然的机会中,在微博上看到某位博主贴出的一串Haskell代码,代码的透明,凝练,模块化,由小到大把我深深的吸引住,了解之余,发现Haskell是一门函数式编程语言,函数式编程语言有着深厚的数学知识作为基础,将电脑的运算看作是数学上的函数计算,可能这也是“数学之美”吧,在震惊之余,我也尝试了解,python是不是也支持函数式编程呢?结果是肯定的,Python作为一门命令式语言,但是也具备了函数式编程的特点。<br> 经过查询资料,不断学习,也慢慢的发现,函数式编程的确是很深奥,甚至于是一种晦涩难懂的编程模式,它将计算机中的运算看作是数学中函数的运算。掌握了可以让我们受益匪浅,也能体会到python一行代码实现强大功能的乐趣。</p>
<h3 id="2、函数式编程里的数学知识"><a href="#2、函数式编程里的数学知识" class="headerlink" title="2、函数式编程里的数学知识"></a>2、函数式编程里的数学知识</h3><p> 函数式编程里面含有很多的数学知识,函数作为函数式编程里面的一等公民,它来源于数学里面函数,而数学中,递归,合成与柯里化,高级函数。这些函数的转化关系,也都体现在了函数式编程中。</p>
<h3 id="3、函数式编程的特点"><a href="#3、函数式编程的特点" class="headerlink" title="3、函数式编程的特点"></a>3、函数式编程的特点</h3><ul>
<li>函数就是数据,函数是一等公民</li>
<li>纯函数:给一个值,一定返回另一个值,运算过程中部会被外部改变,具有透明性</li>
<li>无状态,区别于命令式编程</li>
<li>强编译器的支持(python不支持)</li>
<li></li>
</ul>
<h3 id="4、python函数式编程的实现"><a href="#4、python函数式编程的实现" class="headerlink" title="4、python函数式编程的实现"></a>4、python函数式编程的实现</h3><blockquote>
<p>python里面,函数式编程主要通过一些高阶函数来体现,所谓高阶函数,就是可以接受其他函数作为参数的函数。</p>
</blockquote>
<h4 id="1、内置函数的实现"><a href="#1、内置函数的实现" class="headerlink" title="1、内置函数的实现"></a>1、内置函数的实现</h4><ul>
<li><p>lambda 匿名函数</p>
<p>lambda 在很多编程语言中都有出现,作为一个匿名函数,可以不用让我们不必花时间编写那些简单的函数,比如:</p>
<figure class="highlight llvm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">l = map(lambda <span class="keyword">x</span>: <span class="keyword">x</span>*<span class="keyword">x</span>, xrange(<span class="number">1</span>, <span class="number">10</span>)) # 对序列的每个数进行平方操作</span><br></pre></td></tr></table></figure>
</li>
<li><p>map()</p>
<p> map()本身接收一个函数和一个序列作为参数,然后将传入的函数依次作用在序列中的每个元素中,使用map可以对元素进行高效的处理迭代。比如:</p>
<figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">char_list</span> = [<span class="string">'1'</span>, <span class="string">'2'</span>, <span class="string">'3'</span>]</span><br><span class="line"><span class="attr">num_list</span> = map(int, num_list)</span><br></pre></td></tr></table></figure>
</li>
<li><p>reduce()</p>
<p> reduce()接收一个函数(必须是二元操作函数)和一个序列作为参数,函数会作用于序列的元素,并且会把结果作用于下一个元素。比如:</p>
<figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">l = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">add_exp</span><span class="params">(x, y)</span></span><span class="symbol">:</span></span><br><span class="line"> <span class="keyword">return</span> x+y</span><br><span class="line"></span><br><span class="line">res = reduce(add_exp, l)</span><br></pre></td></tr></table></figure>
</li>
<li><p>groupby()</p>
<p> groupby()是itertools中的一个函数,它的作用是对一个序列进行聚合分组运算,接收一个函数和一个序列,函数作用于参数key</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> itertools <span class="keyword">import</span> groupby</span><br><span class="line"></span><br><span class="line">l = [<span class="number">-1</span>, <span class="number">2</span>, <span class="number">5</span>, <span class="number">7</span>, <span class="number">13</span>]</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">check_num</span><span class="params">(h)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> h><span class="number">10</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'big'</span></span><br><span class="line"> <span class="keyword">elif</span> h<=<span class="number">10</span> <span class="keyword">and</span> h><span class="number">5</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'middle'</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'small'</span></span><br><span class="line"> res = groupby(l, key=check_num)</span><br></pre></td></tr></table></figure>
</li>
</ul>
<ul>
<li><p>filter()</p>
<p> filter()接收一个过滤函数和一个序列,对序列的每个元素,使用过滤函数对元素进行过滤,结果为除去过滤结果为True的元素</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">l = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">is_prime</span><span class="params">(x)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> x % <span class="number">2</span> == <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">True</span></span><br><span class="line">res = filter(is_prime, l)</span><br></pre></td></tr></table></figure>
</li>
</ul>
<h4 id="2、语法的的实现"><a href="#2、语法的的实现" class="headerlink" title="2、语法的的实现"></a>2、语法的的实现</h4><ul>
<li><p>列表生成式</p>
<p> 列表生成式是python一个非常强大的魔法,使用它可以用一行代码表达很多语义,比如:</p>
<figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[ x*x <span class="keyword">for</span> x <span class="keyword">in</span> xrange(<span class="number">10</span>) <span class="keyword">if</span> x % <span class="number">2</span> ==<span class="number">0</span>] <span class="comment"># 求10以内偶数的平方</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>生成器generator</p>
<p> 生成器可以快速生成一个可迭代的对象,操作速度快。</p>
<figure class="highlight autoit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">g_object = (x*x <span class="keyword">for</span> x <span class="keyword">in</span> xrange(<span class="number">5</span>)) <span class="meta"># xragne本身也是生成器</span></span><br><span class="line">g_object.<span class="keyword">next</span>() <span class="meta"># 使用next方法访问</span></span><br></pre></td></tr></table></figure>
</li>
</ul>
<h4 id="3、第三方模块的的实现"><a href="#3、第三方模块的的实现" class="headerlink" title="3、第三方模块的的实现"></a>3、第三方模块的的实现</h4><ul>
<li><p><a href="https://github.com/tobgu/pyrsistent" target="_blank" rel="noopener">pyrsistent</a> 构建纯函数</p>
<pre><code>pysistent第三方库实现了python中一些不可变的数据类型,对于函数而言,使用不可变的数据类型,更加方便我们构造出纯函数
</code></pre></li>
<li><p>functools partial 偏函数</p>
<p> partial的作用可以通过参数调用绑定的函数,设置默认的参数值 </p>
</li>
<li><p>compose (高阶函数) </p>
<p> 当看到compose时, 我的第一反应是这不是和Redux框架中连接中间件的compose一样吗,事实也是这样,他们功能类型,通过compose,可以让函数绑定多个顺序函数。</p>
</li>
<li><p>toolz.functoolz curry</p>
<p> 用于实现函数柯里化,也就是多个单参数函数实现多参数函数的方法</p>
</li>
<li><p>fn模块 fn模块包含大量的易于构建函数式的语法糖</p>
</li>
<li>递归优化(注意Python递归1000个调用限制)</li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
<a class="post-title-link" href="/2017/02/19/python编程美学/" itemprop="url">
python的编程美学
</a>
</h1>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time itemprop="dateCreated" datetime="2017-02-18T17:10:43Z" content="2017-02-18">
2017-02-18
</time>
</span>
<span class="post-category" >
|
<span class="post-meta-item-icon">
<i class="fa fa-folder-o"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="https://schema.org/Thing">
<a href="/categories/python/" itemprop="url" rel="index">
<span itemprop="name">python</span>
</a>
</span>
</span>
<span class="post-comments-count">