三、通過回調(diào)函數(shù)傳遞數(shù)據(jù)
上面討論的兩種向線程中傳遞數(shù)據(jù)的方法是最常用的。但這兩種方法都是main方法中主動將數(shù)據(jù)傳入線程類的。這對于線程來說,是被動接收這些數(shù)據(jù)的。然而,在有些應(yīng)用中需要在線程運行的過程中動態(tài)地獲取數(shù)據(jù),如在下面代碼的run方法中產(chǎn)生了3個隨機數(shù),然后通過Work類的process方法求這三個隨機數(shù)的和,并通過Data類的value將結(jié)果返回。從這個例子可以看出,在返回value之前,必須要得到三個隨機數(shù)。也就是說,這個value是無法事先就傳入線程類的。
43.package mythread;
44.
45.class Data
46.{
47. public int value = 0;
48.}
49.class Work
50.{
51. public void process(Data data, Integer numbers)
52. {
53. for (int n : numbers)
54. {
55. data.value += n;
56. }
57. }
58.}
59.public class MyThread3 extends Thread
60.{
61. private Work work;
62.
63. public MyThread3(Work work)
64. {
65. this.work = work;
66. }
67. public void run()
68. {
69. java.util.Random random = new java.util.Random();
70. Data data = new Data();
71. int n1 = random.nextInt(1000);
72. int n2 = random.nextInt(2000);
73. int n3 = random.nextInt(3000);
74. work.process(data, n1, n2, n3); // 使用回調(diào)函數(shù)
75. System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+"
76. + String.valueOf(n3) + "=" + data.value);
77. }
78. public static void main(String[] args)
79. {
80. Thread thread = new MyThread3(new Work());
81. thread.start();
82. }
83.}
在上面代碼中的process方法被稱為回調(diào)函數(shù)。從本質(zhì)上說,回調(diào)函數(shù)就是事件函數(shù)。在Windows API中常使用回調(diào)函數(shù)和調(diào)用API的程序之間進行數(shù)據(jù)交互。因此,調(diào)用回調(diào)函數(shù)的過程就是最原始的引發(fā)事件的過程。在這個例子中調(diào)用了process方法來獲得數(shù)據(jù)也就相當于在run方法中引發(fā)了一個事件。
相關(guān)推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |