13.2.2 通过实例熟悉如何创建线程

【实例13.3】下面通过一个综合实例,来看看如何创建线程。针对下面的实例,先来看看它的流程,如图13.1所示。

13.2.2 通过实例熟悉如何创建线程 - 图1

图 13.1 老师和学生线程的创建

下面分步骤讲解这个综合程序实例。先定义一个学校的接口,代码如下所示。


01 ///创建一个学校的接口

02 ///定义了三个方法

03 interface school

04 {

05 void set(String schoolname, String grade);

06 String getschool();

07 String getgrade();

08 }


接下来将看看学生线程类的设计,代码如下所示。


09 ///创建一个学生类,并且实现了学校这个接口,让其成为线程类

10 ///schoolname是学校 名称

11 ///grade是 所在年级

12 ///studentname是学生 姓名

13 ///studentcode是学生 学号

14 ///studentsexy是 性别

15 ///studentcourse是所学课程

16 ///studentavg是学生课程平均分

17 ///set是设置器

18 ///get是访问器

19 ///tostring是让对象能以字符串形式输出的方法

20 class student implements Runnable, school

21 {

22 String schoolname;

23 String grade;

24 String studentname;

25 String studentcode;

26 String studentsexy;

27 String studentcourse;

28 String studentavg;

29 public student(String studentname, String studentcode, String studentsexy, String

30 studentcourse)

31 {

32 this.studentname=studentname;

33 this.studentcode=studentcode;

34 this.studentsexy=studentsexy;

35 this.studentcourse=studentcourse;

36 this.tostring();

37 }

38 public void set(String schoolname, String grade)

39 {

40 this.schoolname=schoolname;

41 this.grade=grade;

42 }

43 public String getschool()

44 {

45 return schoolname;

46 }

47 public String getgrade()

48 {

49 return grade;

50 }

51 public void run()

52 {

53 int i=1;

54 int avg=85;

55 for(;i<13;i++)

56 {

57 System.out.println("这个学生的平均成绩是:"+i+"月"+(avg+i*2));

58 }

59 }

60 public String tostring()

61 {

62 String information="学校 名称:"+schoolname+";"+""+"所读年级:"+grade+";

63"+""+"学生 姓名:"+studentname+";"+""+"学生 学号:"+studentcode+";"+""+"学生 性别:

64"+studentsexy+";"+""+"所读专业:"+studentcourse+";"+""+"学生平均分"+studentavg;

65 return information;

66 }

67 }


再看看教师类的设计,代码如下所示。


68 ///创建一个老师类并且实现上面定义的那个接口,以及让它成为线程类

69 ///schoolname是学校 名称

70 ///grade是老师 所在年级

71 ///teachername是老师姓名

72 ///teachercode是老师工号

73 ///teachersexy是老师 性别

74 ///teachercourse是所教的课程

75 ///teachersalary是薪水

76 ///set是设置器

77 ///get是访问器

78 ///tostring是让对象能以字符串形式输出的方法

79 class teacher implements Runnable, school

80 {

81 String schoolname;

82 String grade;

83 String teachername;

84 String teachercode;

85 String teachersexy;

86 String teachercourse;

87 String teachersalary;

88 public teacher(String teachername, String teachercode, String teachersexy, String

89 teachercourse)

90 {

91 this.teachername=teachername;

92 this.teachercode=teachercode;

93 this.teachersexy=teachersexy;

94 this.teachercourse=teachercourse;

95 this.tostring();

96 }

97 public void set(String schoolname, String grade)

98 {

99 this.schoolname=schoolname;

100 this.grade=grade;

101 }

102 public String getschool()

103 {

104 return schoolname;

105 }

106 public String getgrade()

107 {

108 return grade;

109 }

110 public void run()

111 {

112 int i=1;

113 int teachersalary=2000;

114 for(;i<13;i++)

115 {

116 System.out.println("这个老师的薪水是:"+i+"月"+(teachersalary+i*300));

117 }

118 }

119 public String tostring()

120 {

121 String information="学校 名称:"+schoolname+";"+""+"所教年级:"+grade+";

122"+""+" 教师姓名:"+teachername+";"+""+" 教师工号:"+teachercode+";"+""+"教师 性别:

123"+teachersexy+";"+""+"所教课程:"+teachercourse+";"+""+"教师薪水"+teachersalary;

124 return information;

125 }

126 }


最后,主运行程序实现这些对象输出的代码如下所示。


127 ///主运行类

128 ///t是老师类的一个对象

129 ///th和th1是一个线程对象

130 ///set设置器赋值给了每一个对象

131 ///两个start方法代表两个线程的运行

132 public class thread1

133 {

134 public static void main(String[]args)

135 {

136 teacher t=new teacher("董洁","22334","女","英语");

137 t.set("上海师范学院","三年级");

138 Thread th=new Thread(t);

139 student s=new student("张俊","978003","男","计算机");

140 s.set("北京大学","大四");

141 Thread th1=new Thread(s);

142 th.start();

143 th1.start();

144 }

145 }


【代码说明】代码第3~8行定义了接口school,第20~67行定义了学生类student,其实现了两个接口Runnable和school。第79~126行定义了教师类teacher,也是实现了两个接口。

注意 一个类可以实现两个或多个接口,但一个类不能继承两个或两个以上的类。

【运行效果】


这个老师的薪水是:1月2300

这个学生的平均成绩是:1月87

这个老师的薪水是:2月2600

这个学生的平均成绩是:2月89

这个老师的薪水是:3月2900

这个学生的平均成绩是:3月91

这个老师的薪水是:4月3200

这个学生的平均成绩是:4月93

这个老师的薪水是:5月3500

这个学生的平均成绩是:5月95

这个老师的薪水是:6月3800

这个学生的平均成绩是:6月97

这个老师的薪水是:7月4100

这个学生的平均成绩是:7月99

这个老师的薪水是:8月4400

这个学生的平均成绩是:8月101

这个老师的薪水是:9月4700

这个学生的平均成绩是:9月103

这个老师的薪水是:10月5000

这个学生的平均成绩是:10月105

这个老师的薪水是:11月5300

这个学生的平均成绩是:11月107

这个老师的薪水是:12月5600

这个学生的平均成绩是:12月109


这个程序段从某种意义上说,是不可行的,因为它没有按照程序员的意图来输出。本例的主要目的是学习如何创建一个线程,并且从程序中可以看到一个接口的实现过程。