从零开始学Java 有关线程的学习总结

《Java编程思想》整理的一些学习笔记,有不对的地方,欢迎指出。

1
.资源冲突,如果两个线程确实是在修改同一个对象,共享资源的冲突将变得更糟糕,因为这有可能把对象设置成不正确的状态。通过简单的“信号量”概念引入,

把它看作是在两个线程之间进行通信的标志对象。如果信号量的值是零,则它监控的资源是可用的,但如果这个值是非零的,则被监控的资源不可用,所以线程必须

等待。当资源可用的时候,线程增加信号量的值,然后继续执行这个被监控的资源。把增加和减少信号量的操作定义为原子操作,这样就可保证两个线程同时访问同
一资源的时候不至于冲突。 
定义一个简化的信号量:


  1. <code 
  2. class="hljs java has-numbering" style="display: block; padding: 0px; 
  3. color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', 
  4. monospace;font-size:undefined; white-space: pre; border-top-left-radius: 
  5. 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; 
  6. border-bottom-left-radius: 0px; word-wrap: normal; background: 
  7. transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 
  8. 136); box-sizing: border-box;">public</span> <span 
  9. class="hljs-class" style="box-sizing: border-box;"><span 
  10. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  11. border-box;">class</span> <span class="hljs-title" 
  12. style="box-sizing: border-box; color: rgb(102, 0, 
  13. 102);">Semaphore</span> <span class="hljs-keyword" 
  14. style="color: rgb(0, 0, 136); box-sizing: 
  15. border-box;">implements</span> <span class="hljs-title" 
  16. style="box-sizing: border-box; color: rgb(102, 0, 
  17. 102);">Invariant</span>{</span> 
  18.     <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  19. box-sizing: border-box;">private</span> <span 
  20. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  21. border-box;">volatile</span> <span class="hljs-keyword" 
  22. style="color: rgb(0, 0, 136); box-sizing: 
  23. border-box;">int</span> semaphore = <span 
  24. class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: 
  25. border-box;">0</span>; 
  26.     <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  27. box-sizing: border-box;">public</span> <span 
  28. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  29. border-box;">boolean</span> <span class="hljs-title" 
  30. style="box-sizing: border-box;">available</span>(){<span 
  31. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  32. border-box;">return</span> semaphore==<span 
  33. class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: 
  34. border-box;">0</span>;} 
  35.     <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  36. box-sizing: border-box;">public</span> <span 
  37. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  38. border-box;">void</span> <span class="hljs-title" 
  39. style="box-sizing: border-box;">acquire</span>(){ ++semaphore; } 
  40.     <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  41. box-sizing: border-box;">public</span> <span 
  42. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  43. border-box;">void</span> <span class="hljs-title" 
  44. style="box-sizing: border-box;">release</span>(){ --semaphore; } 
  45.     <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  46. box-sizing: border-box;">public</span> InvariantSate <span 
  47. class="hljs-title" style="box-sizing: 
  48. border-box;">invariant</span>(){ 
  49.         <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  50. box-sizing: border-box;">int</span> val = semaphore; 
  51.         <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  52. box-sizing: border-box;">if</span>( val==<span 
  53. class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: 
  54. border-box;">0</span>||val==<span class="hljs-number" 
  55. style="color: rgb(0, 102, 102); box-sizing: 
  56. border-box;">1</span> ) 
  57.             <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  58. box-sizing: border-box;">return</span> <span 
  59. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  60. border-box;">new</span> InvariantOk(); 
  61.         <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  62. box-sizing: border-box;">else</span> 
  63.             <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  64. box-sizing: border-box;">return</span> <span 
  65. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  66. border-box;">new</span> InvariantFailure(<span 
  67. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  68. border-box;">new</span> Integer(val)); 
  69.     } 
  70. }</code><ul class="pre-numbering" style="box-sizing: 
  71. border-box; position: absolute; width: 50px; top: 0px; left: 0px; 
  72. margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; 
  73. border-right-style: solid; border-right-color: rgb(221, 221, 221); 
  74. list-style: none; text-align: right; background-color: rgb(238, 238, 
  75. 238);"><li style="box-sizing: border-box; padding: 0px 
  76. 5px;">1</li><li style="box-sizing: border-box; padding: 0px 
  77. 5px;">2</li><li style="box-sizing: border-box; padding: 0px 
  78. 5px;">3</li><li style="box-sizing: border-box; padding: 0px 
  79. 5px;">4</li><li style="box-sizing: border-box; padding: 0px 
  80. 5px;">5</li><li style="box-sizing: border-box; padding: 0px 
  81. 5px;">6</li><li style="box-sizing: border-box; padding: 0px 
  82. 5px;">7</li><li style="box-sizing: border-box; padding: 0px 
  83. 5px;">8</li><li style="box-sizing: border-box; padding: 0px 
  84. 5px;">9</li><li style="box-sizing: border-box; padding: 0px 
  85. 5px;">10</li><li style="box-sizing: border-box; padding: 0px 
  86. 5px;">11</li><li style="box-sizing: border-box; padding: 
  87. 0px 5px;">12</li><li style="box-sizing: border-box; padding: 
  88. 0px 5px;">13</li></ul> 

(其中Invariant接口在博客:线程测试框架已给出)将semaphore字段设置为volatile ,以确保编译器不会对任何读取此值的操作进行优化。

2.解决共享资源竞争,之前说过,可以通过yield()和setPriority()来给线程调度机制提供建议,但这些建议未必会有多大的效果,这取决
与你的具体平台和JVM实现。Java以提供关键字 synchronized
的形式,为防止资源冲突提供了内置支持。共享资源一般是以对象的形式存在的内存判断,但也可以是文件,输入/输出端口,或者是打印机。要控制对共享资源的

访问,得先把它包装进一个对象。然后把所有要访问这个资源的方法标记为synchronized。即一旦某个线程处于一个标记为synchronized
的方法中,那么在这个线程从该方法返回之前,其他所有要调用类中任何标记为synchronized方法的线程都会被阻塞。 
每个对象都含有单一的锁(也称为监视器),这个锁本身就是对象的一部分(不用写任何特殊代码)。当在对象上调用其任意synchronized方法的时
候,此对象都被加锁,这时该对象上的其他synchronized方法也只能等到前一个方法调用完并释放了锁之后才能被调用。 
针对每一个类也有一个锁(作为类的Class对象的一部分),所以synchronized static 方法可以在类的范围内防止对static数据的并发访问。

3.原子操作,即不能被线程调度机制中断的操作;一旦操作开始,那么它一定可以在可能发生的“上下文切换”之前(切换到其他线程执行)执行完毕。如果问题
中的变量类型是除long或double以外的基本类型,对这种变量进行简单的赋值或返回值操作的时候,才算是原子操作。然而,只要给long或
double加上volatile,操作就是原子的了。注意,在JVM中的自增加操作并不是原子操作,它牵涉到一次读和一次写,所以即使在这样的简单操作

中,也为线程出问题提供了空间。线程工作时,每个线程都可能拥有一个本地栈来维护一些变量的复本,如果把一个变量定义成volatile的,就等于告诉编
译器不要做任何优化,直接在主存操作变量。

4.保证上述问题解决,做安全的做法就是使用下面的方法: 
1)如果要对类中的某个方法进行同步控制,最好同步所有方法。如果忽略了其中一个,通常很难确定这么做是否会有负面影响。 
2)当去除方法的同步控制时,要非常小心。通常这么做是基于性能方面的考虑,但在JDK1.3和JDK1.4中,同步控制所需的负担已经大大的减少。此外,只应在使用性能评价工具证实了同步控制确实是性能瓶颈的时候,才这么做。

5.如果只是希望防止多个线程同时访问方法内部的部分代码而不是防止整个方法,可以使用synchronized关键字来分离代码段,这种方式被称为“临界区”,此时,synchronized被用来指定某个对象,此对象的锁被用来对花括号内的代码进行同步控制:


  1. <code 
  2. class="hljs java has-numbering" style="display: block; padding: 0px; 
  3. color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', 
  4. monospace;font-size:undefined; white-space: pre; border-top-left-radius: 
  5. 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; 
  6. border-bottom-left-radius: 0px; word-wrap: normal; background: 
  7. transparent;">        <span class="hljs-keyword" style="color: 
  8. rgb(0, 0, 136); box-sizing: 
  9. border-box;">synchronized</span>(syncObject){ 
  10.             <span class="hljs-comment" style="color: rgb(136, 0, 0); 
  11. box-sizing: border-box;">// This code can be accessed</span> 
  12.             <span class="hljs-comment" style="color: rgb(136, 0, 0); 
  13. box-sizing: border-box;">//by only one thread at a time</span> 
  14.         }</code><ul class="pre-numbering" style="box-sizing: 
  15. border-box; position: absolute; width: 50px; top: 0px; left: 0px; 
  16. margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; 
  17. border-right-style: solid; border-right-color: rgb(221, 221, 221); 
  18. list-style: none; text-align: right; background-color: rgb(238, 238, 
  19. 238);"><li style="box-sizing: border-box; padding: 0px 
  20. 5px;">1</li><li style="box-sizing: border-box; padding: 0px 
  21. 5px;">2</li><li style="box-sizing: border-box; padding: 0px 
  22. 5px;">3</li><li style="box-sizing: border-box; padding: 0px 
  23. 5px;">4</li></ul> 

使用同步控制块,而不是对整个方法进行同步控制,可以使多个线程访问对象的时间性能得到显著的提高。要注意的是,当对象中的方法在不同的锁上同步的时候,两个线程可以访问同一个对象:


  1. <code 
  2. class="hljs cs has-numbering" style="display: block; padding: 0px; 
  3. color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', 
  4. monospace;font-size:undefined; white-space: pre; border-top-left-radius: 
  5. 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; 
  6. border-bottom-left-radius: 0px; word-wrap: normal; background: 
  7. transparent;">class DualSynch { 
  8.  
  9.     <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  10. box-sizing: border-box;">private</span> Object syncObject = 
  11. <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  12. border-box;">new</span> Object(); 
  13.  
  14.     <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  15. box-sizing: border-box;">public</span> synchronized <span 
  16. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  17. border-box;">void</span> <span class="hljs-title" 
  18. style="box-sizing: border-box;">f</span>() { 
  19.         System.<span class="hljs-keyword" style="color: rgb(0, 0, 
  20. 136); box-sizing: border-box;">out</span>.println(<span 
  21. class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: 
  22. border-box;">"Inside f()"</span>); 
  23.         <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  24. box-sizing: border-box;">try</span> { 
  25.             Thread.sleep(<span class="hljs-number" style="color: 
  26. rgb(0, 102, 102); box-sizing: border-box;">500</span>); 
  27.         } <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  28. box-sizing: border-box;">catch</span> (InterruptedException e) { 
  29.             <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  30. box-sizing: border-box;">throw</span> <span 
  31. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  32. border-box;">new</span> RuntimeException(e); 
  33.         } 
  34.         System.<span class="hljs-keyword" style="color: rgb(0, 0, 
  35. 136); box-sizing: border-box;">out</span>.println(<span 
  36. class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: 
  37. border-box;">"leaving f()"</span>); 
  38.     } 
  39.  
  40.     <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  41. box-sizing: border-box;">public</span> <span 
  42. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  43. border-box;">void</span> <span class="hljs-title" 
  44. style="box-sizing: border-box;">g</span>() { 
  45.  
  46.         synchronized (syncObject) { 
  47.             System.<span class="hljs-keyword" style="color: rgb(0, 0, 
  48. 136); box-sizing: border-box;">out</span>.println(<span 
  49. class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: 
  50. border-box;">"Inside g()"</span>); 
  51.             <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  52. box-sizing: border-box;">try</span> { 
  53.                 Thread.sleep(<span class="hljs-number" style="color: 
  54. rgb(0, 102, 102); box-sizing: border-box;">500</span>); 
  55.             } <span class="hljs-keyword" style="color: rgb(0, 0, 
  56. 136); box-sizing: border-box;">catch</span> 
  57. (InterruptedException e) { 
  58.                 <span class="hljs-keyword" style="color: rgb(0, 0, 
  59. 136); box-sizing: border-box;">throw</span> <span 
  60. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  61. border-box;">new</span> RuntimeException(e); 
  62.             } 
  63.             System.<span class="hljs-keyword" style="color: rgb(0, 0, 
  64. 136); box-sizing: border-box;">out</span>.println(<span 
  65. class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: 
  66. border-box;">"leaving g()"</span>); 
  67.         } 
  68.     } 
  69.  
  70. <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  71. border-box;">public</span> <span class="hljs-keyword" 
  72. style="color: rgb(0, 0, 136); box-sizing: 
  73. border-box;">class</span> SyncObject{ 
  74.  
  75.     <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  76. box-sizing: border-box;">public</span> <span 
  77. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  78. border-box;">static</span> <span class="hljs-keyword" 
  79. style="color: rgb(0, 0, 136); box-sizing: 
  80. border-box;">void</span> <span class="hljs-title" 
  81. style="box-sizing: border-box;">main</span>(String[] args){ 
  82.         final DualSynch ds = <span class="hljs-keyword" style="color: 
  83. rgb(0, 0, 136); box-sizing: border-box;">new</span> 
  84. DualSynch(); 
  85.  
  86.         <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  87. box-sizing: border-box;">new</span> Thread(){ 
  88.             <span class="hljs-keyword" style="color: rgb(0, 0, 136); 
  89. box-sizing: border-box;">public</span> <span 
  90. class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: 
  91. border-box;">void</span> <span class="hljs-title" 
  92. style="box-sizing: border-box;">run</span>(){ 
  93.                 ds.f(); 
  94.             } 
  95.         }.start();; 
  96.  
  97.         ds.g(); 
  98.     } 
  99. }</code><ul class="pre-numbering" style="box-sizing: 
  100. border-box; position: absolute; width: 50px; top: 0px; left: 0px; 
  101. margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; 
  102. border-right-style: solid; border-right-color: rgb(221, 221, 221); 
  103. list-style: none; text-align: right; background-color: rgb(238, 238, 
  104. 238);"><li style="box-sizing: border-box; padding: 0px 
  105. 5px;">1</li><li style="box-sizing: border-box; padding: 0px 
  106. 5px;">2</li><li style="box-sizing: border-box; padding: 0px 
  107. 5px;">3</li><li style="box-sizing: border-box; padding: 0px 
  108. 5px;">4</li><li style="box-sizing: border-box; padding: 0px 
  109. 5px;">5</li><li style="box-sizing: border-box; padding: 0px 
  110. 5px;">6</li><li style="box-sizing: border-box; padding: 0px 
  111. 5px;">7</li><li style="box-sizing: border-box; padding: 0px 
  112. 5px;">8</li><li style="box-sizing: border-box; padding: 0px 
  113. 5px;">9</li><li style="box-sizing: border-box; padding: 0px 
  114. 5px;">10</li><li style="box-sizing: border-box; padding: 0px 
  115. 5px;">11</li><li style="box-sizing: border-box; padding: 
  116. 0px 5px;">12</li><li style="box-sizing: border-box; padding: 
  117. 0px 5px;">13</li><li style="box-sizing: border-box; 
  118. padding: 0px 5px;">14</li><li style="box-sizing: border-box; 
  119. padding: 0px 5px;">15</li><li style="box-sizing: 
  120. border-box; padding: 0px 5px;">16</li><li style="box-sizing: 
  121. border-box; padding: 0px 5px;">17</li><li 
  122. style="box-sizing: border-box; padding: 0px 5px;">18</li><li 
  123. style="box-sizing: border-box; padding: 0px 
  124. 5px;">19</li><li style="box-sizing: border-box; padding: 0px 
  125. 5px;">20</li><li style="box-sizing: border-box; padding: 
  126. 0px 5px;">21</li><li style="box-sizing: border-box; padding: 
  127. 0px 5px;">22</li><li style="box-sizing: border-box; 
  128. padding: 0px 5px;">23</li><li style="box-sizing: border-box; 
  129. padding: 0px 5px;">24</li><li style="box-sizing: 
  130. border-box; padding: 0px 5px;">25</li><li style="box-sizing: 
  131. border-box; padding: 0px 5px;">26</li><li 
  132. style="box-sizing: border-box; padding: 0px 5px;">27</li><li 
  133. style="box-sizing: border-box; padding: 0px 
  134. 5px;">28</li><li style="box-sizing: border-box; padding: 0px 
  135. 5px;">29</li><li style="box-sizing: border-box; padding: 
  136. 0px 5px;">30</li><li style="box-sizing: border-box; padding: 
  137. 0px 5px;">31</li><li style="box-sizing: border-box; 
  138. padding: 0px 5px;">32</li><li style="box-sizing: border-box; 
  139. padding: 0px 5px;">33</li><li style="box-sizing: 
  140. border-box; padding: 0px 5px;">34</li><li style="box-sizing: 
  141. border-box; padding: 0px 5px;">35</li><li 
  142. style="box-sizing: border-box; padding: 0px 5px;">36</li><li 
  143. style="box-sizing: border-box; padding: 0px 
  144. 5px;">37</li><li style="box-sizing: border-box; padding: 0px 
  145. 5px;">38</li><li style="box-sizing: border-box; padding: 
  146. 0px 5px;">39</li><li style="box-sizing: border-box; padding: 
  147. 0px 5px;">40</li><li style="box-sizing: border-box; 
  148. padding: 0px 5px;">41</li><li style="box-sizing: border-box; 
  149. padding: 0px 5px;">42</li></ul> 

DualSync对象的f()方法在this上同步(通过在整个方法同步),g()的同步控制块在syncObject对象上同步,因此,两个同步控制相
互独立,两个方法同时鱼腥,所以它们没有在对象的同步控制上阻塞。因此,必须把访问共享资源的代码段包装进一个合适的同步控制块。

6.线程有四个状态:新建、就绪、死亡、阻塞(程序能够运行,但有某个条件阻止它运行)。进入阻塞状态的原因: 
1)通过调用sleep(miliseconds)使线程进入休眠状态,在指定的时间内不运行。 
2)调用wait()使线程挂起,直到线程得道了notify()或notifyAll()消息,线程才会进入就绪状态。 
3)线程在等待某个输入/输出完成。 
4)线程在某个对象上调用其同步方法,但是对象锁不可用。

7.线程之间为避免冲突,通过“握手机制”来进行的,这种握手可以通过Object的方法wait()和notify()来安全的实现。注意,调用
sleep()的时候锁并没有被释放,而调用wait()方法的确释放了锁,这就意味着,再调用wait()期间,可以调用线程对象中的其他同步控制方
法,当一个线程在方法里遇到了对wait()的调用的时候,线程的执行被挂起,对象上的锁被释放。 
wait()有两种形式,一种与sleep()一样接受毫秒数,不同之处: 
1)在wait()期间对象锁是释放的。 
2)可以通过notify()、notifyAll(),或者指令时间到期,从wait()中回复执行。 
另一种是不带参数的,wait()将无限等下去,知道接收到notify()或notifyAll()的消息。

8.wait()、notify()、notifyAll()这些方法是基类Object的一部分,而不是像sleep()那样属于Thread的一部

分。因为这些功能要用到的锁也是所有对象的一部分,所以,你可以把wait()方法放在任何同步控制方法里,不用考虑这个类是否继承Thread或者实现
Runnable接口。只能在同步控制方法或同步控制块中调用wait()、notify()、notifyAll()的线程在调用这些方法前必须“拥
有”(获取)对象的锁。(sleep不用操作锁,所以可以在非同步控制方法里调用)。


  1. <code 
  2. class="hljs java has-numbering" style="display: block; padding: 0px; 
  3. color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', 
  4. monospace;font-size:undefined; white-space: pre; border-top-left-radius: 
  5. 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; 
  6. border-bottom-left-radius: 0px; word-wrap: normal; background: 
  7. transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 
  8. 136); box-sizing: border-box;">synchronized</span>(x){ 
  9.     x.notify(); 
  10. }</code> 

 

来源:51CTO

时间: 2024-11-02 18:06:25

从零开始学Java 有关线程的学习总结的相关文章

从零开始学 Java (一) Hello World 左光 2005.4

从零开始学 Java  (一) Hello World     左光 2005.4 从昨天开始学习 Java,把自己在学习中遇到的一些问题和体会发出来,供大家借鉴. 要想编写一个 Java 版的 Hello World  程序并运行需要完成下面两步: 1.下载并安装JDK5.0 或者 JDK1.4.2 .不要对版本号产生什么疑问,据我的理解,JDK5.0 也就是JDK1.5 ,是 JDK1.4.2 的重要升级,里面加了许多新的语言特性,为什么叫 5.0 而不叫1.5 ,我想可能是出于商业上的考虑

新手求教:从零开始学java,那本书好点?

问题描述 新手求教:从零开始学java,那本书好点? 解决方案 解决方案二:corejava解决方案三:先找个视频看看解决方案四:买本高教的书吧,权威解决方案五:我是看先看张孝祥,再看尚学堂(看了半截),现在看韩顺平.基础学了一年,还没完.你总不比我笨吧?解决方案六:ThinkinJava看上两遍,基本概念就会了.解决方案七:不是选书的问题任何书都是差不多的还是要自己多动手推荐java核心技术里面讲的都是基础我这里有pdf文件需要的话传给你解决方案八:不知道你有没有其他语言的基础,要是有的话,上

学Java做项目需要学习的一些技能_java

Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1.掌握项目开发的基本步骤 2.具备极强的面向对象的分析与设计技巧 3.掌握用例驱动.以架构为核心的主流开发方法 没有人愿意自己一辈子就满足于掌握了一些代码实现的技巧,别人告诉你要实现什么,你就用代码堆砌来实现别人的要求!你必须学会从整个项目的角度去思考!你必须学会假如你是项目经理,你该如何思考!你必须学会假如你是架构师,你该如何思考!你必须掌握针对某个特定问题领域的分析方法!

从零开始学JAVA之可变参数_java

下面是一个简单的小程序: 复制代码 代码如下: import java.util.Arrays; class lesson6 {     public static void main(String[] args)     {         int array[]={2,3,1,5,4,6};         System.out.println(Arrays.toString(array));         System.out.println(getSum(array));       

mysql-刚学JAVA,求个MySQL使用线程池插入表的例子

问题描述 刚学JAVA,求个MySQL使用线程池插入表的例子 就只对一个表进行插入,只要 insert into table(number) values(?) ,这个操作就行, 因为我想要插入十万条,百万条数据,次数大了用普通的效率太低了,上网查了都说是用线程池可以提高几倍,找了很久都没有具体例子,有的都是看不懂的.求好人给我个简单的例子,谢谢了!对了,祝大家 新年快乐! 解决方案 线程池提高效率是建立在连接上面的,怎么感觉跟你说的不太沾边呢,你的意思是要sql语句,还是创建线程池的代码 解决

学java得这样学,学习确实也得这样_java

引言     软件开发之路是充满荆棘与挑战之路,也是充满希望之路.Java学习也是如此,没有捷径可走.梦想像<天龙八部>中虚竹一样被无崖子醍醐灌顶而轻松获得一甲子功力,是很不现实的.每天仰天大叫"天神啊,请赐给我一本葵花宝典吧",殊不知即使你获得了葵花宝典,除了受自宫其身之苦外,你也不一定成得了"东方不败",倒是成"西方失败"的几率高一点.     "不走弯路,就是捷径",佛经说的不无道理.     1.如何学习程

新手学JAVA(十)-多线程----线程的创建和启动

Java使用Thread类代表线程,所有的线程对象都必须是Thread类或者其子类的实例.每个下次你哼的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码).Java使用线程执行体来代表这段程序流     在Java线程的创建有三种方式      通过继承Thread类创建线程类 步骤如下 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务.因此把run()方法称为线程执行体. 创建Thread子类的实例,即创建了线程的对象.

新手学JAVA(三)----StringBuilder类

   上一篇文章新手学JAVA(二)----String类与StringBuffer类的区别中了解到,String的值是不可变的,这就导致 每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变 类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象.       StringBuffer类和StringBuilder类功能基本相似.算是两个双胞胎.   下面主要说两点   第一点  线程安全   Str

基础-关于初级的java菜鸟该怎么学习java

问题描述 关于初级的java菜鸟该怎么学习java 有人可以给我推荐一下作为一个java菜鸟,我该看什么什么类型的书,什么书, 还有该如何学习java,是多看多练么?我是学生,学过c语言,基础不是很好. 解决方案 如果之前有编程基础的话学起java来不会那么吃力.我这有一本很全面的电子书,希望能够帮到你,http://pan.baidu.com/s/1dDGPTN7 http://pan.baidu.com/s/1i3knIol 解决方案二: 学以致用,以用养学. 以下为一家之言: 首先,还是得