思考学校、小学、中学、中专、大学之间的关系,创建一个Java项目编程实现。提示:内容自定。
什么叫思考他们的关系?你会用继承不就能写出来了嘛
来自chatgpt的回答
首先,我们需要定义一个School类,以及它的子类ElementarySchool、MiddleSchool和University。其中,ElementarySchool和MiddleSchool是School的子类,而University则是它的兄弟类(即和School同级别的类)。
java
public class School {
private String name;
private int foundingYear;
public School(String name, int foundingYear) {
this.name = name;
this.foundingYear = foundingYear;
}
// 省略getter和setter方法
// ...
}
public class ElementarySchool extends School {
private String address;
public ElementarySchool(String name, int foundingYear, String address) {
super(name, foundingYear);
this.address = address;
}
// 省略getter和setter方法
// ...
}
public class MiddleSchool extends School {
private int studentCount;
public MiddleSchool(String name, int foundingYear, int studentCount) {
super(name, foundingYear);
this.studentCount = studentCount;
}
// 省略getter和setter方法
// ...
}
public class University {
private String name;
private int foundingYear;
private String president;
public University(String name, int foundingYear, String president) {
this.name = name;
this.foundingYear = foundingYear;
this.president = president;
}
// 省略getter和setter方法
// ...
}
接着,我们可以定义一个Interface类,来表示各个学校之间的共同特征,比如说它们都有一个校名和创办年份。
java
public interface Interface {
String getName();
int getFoundingYear();
}
最后,我们可以让School类实现这个接口,并根据需要在子类中重写相应的方法。
java
public class School implements Interface {
// 省略上面的内容
@Override
public String getName() {
return name;
}
@Override
public int getFoundingYear() {
return foundingYear;
}
}
public class ElementarySchool extends School {
// 省略上面的内容
@Override
public String getName() {
// 在校名前面加上“小学”三个字
return "小学" + super.getName();
}
}
public class MiddleSchool extends School {
// 省略上面的内容
@Override
public String getName() {
// 在校名前面加上“中学”三个字
return "中学" + super.getName();
}
}
public class University implements Interface {
// 省略上面的内容
@Override
public String getName() {
return name;
}
@Override
public int getFoundingYear() {
return foundingYear;
}
}
这样一来,我们就可以方便地创建各种学校的实例,并使用它们的方法来获取所需信息。例如:
java
ElementarySchool es = new ElementarySchool("一小", 1950, "石家庄市长安区");
MiddleSchool ms = new MiddleSchool("一中", 1901, 2000);
University u = new University("清华大学", 1911, "邱勇");
System.out.println(es.getName() + "成立于" + es.getFoundingYear() + "年,地址在" + es.getAddress());
System.out.println(ms.getName() + "成立于" + ms.getFoundingYear() + "年,学生人数为" + ms.getStudentCount());
System.out.println(u.getName() + "成立于" + u.getFoundingYear() + "年,校长是" + u.getPresident());
输出结果如下:
小学一小成立于1950年,地址在石家庄市长安区
中学一中成立于1901年,学生人数为2000
清华大学成立于1911年,校长是邱勇
int corePoolSize:该线程池中核心线程数最大值核心线程
线程池新建线程的时候,如果当前线程总数小于corePoolSize,则新建的是核心线程,如果超过corePoolSize,则新建的是非核心线程,核心线程默认情况下会一直存活在线程池中,即使为闲置状态。如果指定ThreadPoolExecutor的allowCoreThreadTimeOut这个属性为true,那么核心线程如果不干活(闲置状态)的话,超过一定时间(时长下面参数决定),就会被销毁掉。
int maximumPoolSize:该线程池中线程总数最大值
线程总数 = 核心线程数 + 非核心线程数。
long keepAliveTime:线程池中线程等待任务的超时时长
一个非核心线程,如果获取任务(即闲置状态)的时长超过这个参数所设定的时长,就会被销毁掉。默认情况下(allowCoreThreadTimeOut = false),只作用于非核心线程,也可以使其作用于核心线程。
TimeUnit unit:keepAliveTime时间单位
BlockingQueue workQueue:该线程池中的任务队列,维护着等待执行的 Runnable 对象
当核心线程数已经到达最大值时,新添加的任务会被添加到这个队列中等待处理。
常用的workQueue类型:
SynchronousQueue:
不存储元素 的阻塞队列,每一个 put 操作必须等待一个 take 操作,否则不能继续添加元素。因此这里的 Synchronous 指的是读线程和写线程需要同步,数据必须从某个写线程交给某个读线程,而不是在队列中等待被消费。
由此可知,SynchronousQueue 的吞吐量比 唤醒空闲线程执行任务 的 LinkedBlockingQueue 和 ArrayBlockingQueue 高。
LinkedBlockingQueue:链表实现的有界阻塞队列,元素排序按 FIFO。注意:该队列默认大小为 Integer.MAX_VALUE。
ExecutorService fixedThreadPool = new ThreadPoolExecutor(6, 10, 60L, TimeUnit.SECONDS,new LinkedBlockingQueue<>(18));
for (int i = 0; i < 100; i++) {
int finalI = i;
fixedThreadPool.execute(new Runnable(){
@Override
public void run() {
System.out.println(finalI+"fixedThreadPool "+Thread.currentThread().getName());
try {
Thread.sleep(50000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
print:
0fixedThreadPool pool-1-thread-1
2fixedThreadPool pool-1-thread-3
4fixedThreadPool pool-1-thread-5
1fixedThreadPool pool-1-thread-2
24fixedThreadPool pool-1-thread-7
3fixedThreadPool pool-1-thread-4
5fixedThreadPool pool-1-thread-6
25fixedThreadPool pool-1-thread-8
27fixedThreadPool pool-1-thread-10
java.util.concurrent.RejectedExecutionException:......
ExecutorService fixedThreadPool = new ThreadPoolExecutor(6, 10, 60L, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(18));
for (int i = 0; i < 100; i++) {
int finalI = i;
fixedThreadPool.execute(new Runnable(){
@Override
public void run() {
System.out.println(finalI+"fixedThreadPool "+Thread.currentThread().getName());
try {
Thread.sleep(50000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
print:
RejectedExecutionException.....
1fixedThreadPool pool-1-thread-2
3fixedThreadPool pool-1-thread-4
5fixedThreadPool pool-1-thread-6
25fixedThreadPool pool-1-thread-8
27fixedThreadPool pool-1-thread-10
2fixedThreadPool pool-1-thread-3
0fixedThreadPool pool-1-thread-1
4fixedThreadPool pool-1-thread-5
26fixedThreadPool pool-1-thread-9
24fixedThreadPool pool-1-thread-7
PriorityBlockingQueue:支持优先级排序的无界阻塞队列,基于数组的二叉堆实现。添加元素时,如果容量不足会使用 tryGrow 进行扩容。
DelayQueue:支持延迟获取元素的无界阻塞队列,队列内元素必须实现 Delayed 接口(Delay接口又继承了 Comparable,需要实现 compareTo 方法)。每个元素都需要指明过期时间,通过 getDelay(unit) 获取元素剩余时间(剩余时间 = 到期时间 - 当前时间)
当从队列获取元素时,只有过期的元素才会出队列。
LinkedTransferQueue:由链表组成的无界 TransferQueue
LinkedBlockingDeque:由链表构成的界限可选的双端阻塞队列,如不指定边界,则为 Integer.MAX_VALUE。
ThreadFactory threadFactory
创建线程的方式,这是一个接口,你new他的时候需要实现他的Thread newThread(Runnable r)方法
RejectedExecutionHandler handler
当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理;
jdk1.5 后提供了四种饱和策略 :
AbortPolicy :默认。直接抛异常(RejectedExecutionException)。
CallerRunsPolicy :只用调用者所在的线程执行任务,重试添加当前的任务,它会自动重复调用execute()方法
DiscardOldestPolicy :丢弃任务队列中最久的任务。
DiscardPolicy :丢弃当前任务。
针对问题,具体步骤如下:
参考代码如下:
CREATE TABLE school (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
type VARCHAR(50) NOT NULL,
location VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
);
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class SchoolQueryService {
private static final String DB_URL = "jdbc:mysql://localhost:3306/school_db";
private static final String DB_USER = "root";
private static final String DB_PASS = "root";
// 查询学校列表
public List<School> querySchools(String name, String type, String location) throws SQLException {
List<School> schools = new ArrayList<>();
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
StringBuilder sb = new StringBuilder("SELECT * FROM school WHERE 1 ");
List<Object> params = new ArrayList<>();
if (name != null && !name.isEmpty()) {
sb.append("AND name like ? ");
params.add("%" + name + "%");
}
if (type != null && !type.isEmpty()) {
sb.append("AND type = ? ");
params.add(type);
}
if (location != null && !location.isEmpty()) {
sb.append("AND location like ? ");
params.add("%" + location + "%");
}
stmt = conn.prepareStatement(sb.toString());
for (int i = 0; i < params.size(); i++) {
stmt.setObject(i + 1, params.get(i));
}
rs = stmt.executeQuery();
while (rs.next()) {
schools.add(new School(rs.getString("name"), rs.getString("type"), rs.getString("location")));
}
} finally {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
}
return schools;
}
}
class School {
private String name;
private String type;
private String location;
public School(String name, String type, String location) {
this.name = name;
this.type = type;
this.location = location;
}
// 省略getter、setter方法
}
public class SchoolQueryController {
private SchoolQueryService service = new SchoolQueryService();
// 查询学校列表
public List<School> querySchools(String name, String type, String location) throws SQLException {
return service.querySchools(name, type, location);
}
}
import java.sql.SQLException;
import java.util.List;
public class Main {
public static void main(String[] args) {
SchoolQueryController controller = new SchoolQueryController();
try {
List<School> schools = controller.querySchools("北京", "中学", "海淀");
for (School school : schools) {
System.out.println(school.getName());
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
可以采取以下措施来优化查询性能:
总之,针对这个问题,需要从需求确定开始,设计数据库结构和接口,编写Java代码来实现查询服务,并优化性能以提高查询效率。