13.2.2 通过实例熟悉如何创建线程
【实例13.3】下面通过一个综合实例,来看看如何创建线程。针对下面的实例,先来看看它的流程,如图13.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
这个程序段从某种意义上说,是不可行的,因为它没有按照程序员的意图来输出。本例的主要目的是学习如何创建一个线程,并且从程序中可以看到一个接口的实现过程。