Thinking In Java 學習筆記(一)

最近都在學習java,以下是學習筆記。


1 線程
1.1基本線程處理
1)throw與throws的區別
前者用於拋出單個異常,並且該異常知道如何處理,通常是放在catch子句塊中,當然也可以在任何想拋出異常的地方。後者可以拋出單個或多個異常,不知道如何處理,通常是放在函數定義後。如下代碼片段。

2)join作用
參加,也要別人同意啊。所以,這個函數就是在保證其他線程執行完後,才創建線程。如下,循環創建多個線程,每個線程都是在前面一個線程完成執行後才創建的。
for(int i = 0;i < 5;i ++){
new TestThread().join();
}
3)setPriority設置優先級
可以用來設置線程優先級,優先級高的會使得其執行頻率增加。
對於每個操作系統,所規定的線程優先級級數不一致。JDK規定了十個級數。一般使用Thread.MAX_PRORITY、Thread.NORMAL_PRORITY、Thread.MIN_PRORITY三個級數,就可以避免在不同操作系統出現的此類問題。
4)deamon設置爲後臺
public final void setDaemon (boolean isDaemon)
可以用來設置爲後臺進程。
某線程A爲非後臺進程,若使用該函數創建了後臺進程B,那麼當A終止執行時,後臺進程B也會終止執行,即使B仍未執行完代碼。
5)join進階作用
線程A在等待另一個線程B執行完之前,若B自己調用interrupt終止執行,則A馬上繼續執行join後面的代碼。
Join也能傳入一個時間參數,該參數表示在規定時間到達時,不管B是否執行完,A均繼續執行join後面的代碼。
6)runable的作用
Runable使得對象在繼承了其他類的情況下,實現線程方法,間接實現多重繼承。
Runable只有run方法,當要實現除run方法以外的方法時,可以通過Thread.currentThread()來獲得線程對象。如下

使用內部類將線程方法封裝起來更加清晰,這裏不使用runable。
如下。


1.2進階線程處理
1)timer.schedule
小貼士
Timer.schedule
void schedule(TimerTask task, long delay)
Schedule a task for single execution after a specified delay.
一般用在運行一個delay的任務,跟thread.sleep差不多。

2)synchronize使用
Static synchronize修飾的方法用於對整個類下所有實例化的對象調用到該方法時均需要同步處理。
Synchronize修飾的方法用於對類下每個實例化的對象在調用到該方法時需要同步處理,也即若A、B兩個對象都屬於同一個類,A、B兩對象在訪問到同一個synchronize修飾的類方法時,互不干擾。只有在A這個類第二次訪問到A這個方法或是B這個類第二次訪問到B這個方法,纔有同步處理。
小貼士
以下摘自http://blog.csdn.net/virgoboy2004/article/details/7585182,謝謝作者。
【問題描述】關於Java中synchronized 用在實例方法和對象方法上面的區別
【問題分析】大家都知道,在Java中,synchronized 是用來表示同步的,我們可以synchronized 來修飾一個方法(實例方法和類方法---注:不知道這樣叫準確不準確,大家理解我的意識就行了)。也可以synchronized 來修飾方法裏面的一個語句塊。
修飾實例方法:
[java] view plaincopy
1. public synchronized void x() throws InterruptedException
2. {
3. for (int i = 0; i < 10; i++)
4. {
5. Thread.sleep(1000);
6. System.out.println("x.......................");
7. }
8. }

修飾類方法(static 方法):
[java] view plaincopy
1. public static synchronized void staticX() throws InterruptedException
2. {
3. for (int i = 0; i < 10; i++)
4. {
5. Thread.sleep(1000);
6. System.out.println("staticX.......................");
7. }
8. }

修飾方法裏面語句塊:
[java] view plaincopy
1. public static void staticX() throws InterruptedException
2. {
3. synchronized (locks)
4. {
5. for (int i = 0; i < 10; i++)
6. {
7. Thread.sleep(1000);
8. System.out.println("staticX.......................");
9. }
10. }
11. }
注意:這裏不能用synchronized修飾方法外面的語句塊(我把他叫做類語句塊),雖然我們可以在方法外面定義語句塊,這樣做會遇到編譯錯誤,這裏涉及到了Java裏面的對象初始化的部分知識。大概的原因就是synchronized鎖住的是對象,當初始化對象的時候,JVM在對象初始化完成之前會調用方法外面的語句塊,這個時候對象還不存在,所以就不存在鎖了。
那麼,在static方法和非static方法前面加synchronized到底有什麼不同呢?
大家都知道,static的方法屬於類方法,它屬於這個Class(注意:這裏的Class不是指Class的某個具體對象),那麼static獲取到的鎖,就是當前調用這個方法的對象所屬的類(Class,而不再是由這個Class產生的某個具體對象了)。而非static方法獲取到的鎖,就是當前調用這個方法的對象的鎖了。所以,他們之間不會產生互斥。
看代碼:
[java] view plaincopy
1. package com.jack.zhang.chapter9.classlock;
2.
3. /**
4. * @author Jack Zhang
5. * @version vb1.0
6. * @Email [email protected]
7. * @Date 2012-5-20
8. */
9. public class Test
10. {
11. public static synchronized void staticX() throws InterruptedException
12. {
13. for (int i = 0; i < 10; i++)
14. {
15. Thread.sleep(1000);
16. System.out.println("staticX.......................");
17. }
18. }
19.
20. public synchronized void x() throws InterruptedException
21. {
22. for (int i = 0; i < 10; i++)
23. {
24. Thread.sleep(1000);
25. System.out.println("x.......................");
26. }
27. }
28.
29. public static void main(String[] args)
30. {
31. final Test test1 = new Test();
32. Thread thread = new Thread(new Runnable()
33. {
34. public void run()
35. {
36. try
37. {
38. test1.x();
39. }
40. catch (InterruptedException e)
41. {
42. // TODO Auto-generated catch block
43. e.printStackTrace();
44. }
45. }
46. }, "a");
47.
48. Thread thread1 = new Thread(new Runnable()
49. {
50. public void run()
51. {
52. try
53. {
54. Test.staticX();
55. }
56. catch (InterruptedException e)
57. {
58. // TODO Auto-generated catch block
59. e.printStackTrace();
60. }
61. }
62. }, "b");
63.
64. thread1.start();
65. thread.start();
66. }
67. }

運行結果是:
[java] view plaincopy
1. staticX.......................
2. x.......................
3. x.......................
4. staticX.......................
5. staticX.......................
6. x.......................
7. x.......................
8. staticX.......................
9. x.......................
10. staticX.......................
11. staticX.......................
12. x.......................
13. x.......................
14. staticX.......................
15. x.......................
16. staticX.......................
17. x.......................
18. staticX.......................
19. x.......................
20. staticX.......................


那當我們想讓所有這個類下面的對象都同步的時候,也就是讓所有這個類下面的對象共用同一把鎖的時候,我們如何辦呢?
看代碼:
[java] view plaincopy
1. package com.jack.zhang.chapter9.classlock;
2.
3.
4. /**
5. * @author Jack Zhang
6. * @version vb1.0
7. * @Email [email protected]
8. * @Date 2012-5-20
9. */
10. public class Test
11. {
12. public final static Byte[] locks = new Byte[0];
13.
14. public static void staticX() throws InterruptedException
15. {
16. synchronized (locks)
17. {
18. for (int i = 0; i < 10; i++)
19. {
20. Thread.sleep(1000);
21. System.out.println("staticX.......................");
22. }
23. }
24. }
25.
26. public void x() throws InterruptedException
27. {
28. synchronized (locks)
29. {
30. for (int i = 0; i < 10; i++)
31. {
32. Thread.sleep(1000);
33. System.out.println("x.......................");
34. }
35. }
36. }
37.
38. public static void main(String[] args)
39. {
40. final Test test1 = new Test();
41. final Test test2 = new Test();
42. Thread thread = new Thread(new Runnable()
43. {
44. public void run()
45. {
46. try
47. {
48. test1.x();
49. }
50. catch (InterruptedException e)
51. {
52. // TODO Auto-generated catch block
53. e.printStackTrace();
54. }
55. }
56. }, "a");
57.
58. Thread thread1 = new Thread(new Runnable()
59. {
60. public void run()
61. {
62. try
63. {
64. Test.staticX();
65. }
66. catch (InterruptedException e)
67. {
68. // TODO Auto-generated catch block
69. e.printStackTrace();
70. }
71. }
72. }, "b");
73.
74. thread1.start();
75. thread.start();
76. }
77. }

運行結果:
[java] view plaincopy
1. staticX.......................
2. staticX.......................
3. staticX.......................
4. staticX.......................
5. staticX.......................
6. staticX.......................
7. staticX.......................
8. staticX.......................
9. staticX.......................
10. staticX.......................
11. x.......................
12. x.......................
13. x.......................
14. x.......................
15. x.......................
16. x.......................
17. x.......................
18. x.......................
19. x.......................
20. x.......................

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章