- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的任务是创建一个 SQL 数据库并用 Java 创建一个 GUI 来访问它。我几乎已经有了它,但我有一个关于线程的问题。今天之前,我没有在程序中使用任何线程,因此,为了从数据库中提取 150 条记录,我必须等待大约 5 - 10 秒。这非常不方便,我不确定是否可以解决这个问题。今天,我在互联网上查找了有关在与我的程序类似的程序中使用线程的信息,我决定在此方法中仅使用一个线程:
public Vector VectorizeView(final String viewName) {
final Vector table = new Vector();
int cCount = 0;
try {
cCount = getColumnCount(viewName);
} catch (SQLException e1) {
e1.printStackTrace();
}
final int viewNameCount = cCount;
Thread runner = new Thread(){
public void run(){
try {
Connection connection = DriverManager.getConnection(getUrl(),
getUser(), getPassword());
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery("Select * FROM "
+ viewName);
while (result.next()) {
Vector row = new Vector();
for (int i = 1; i <= viewNameCount; i++) {
String resultString = result.getString(i);
if (result.wasNull()) {
resultString = "NULL";
} else {
resultString = result.getString(i);
}
row.addElement(resultString);
}
table.addElement(row);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
};
runner.start();
return table;
}
我真正改变的唯一一件事是添加线程“运行程序”,性能呈指数级增长。通过这种方式,几乎可以立即提取 500 条记录。
该方法之前看起来像这样:
public Vector VectorizeTable(String tableName) {
Vector<Vector> table = new Vector<Vector>();
try {
Connection connection = DriverManager.getConnection(getUrl(),
getUser(), getPassword());
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery("Select * FROM "
+ tableName);
while (result.next()) {
Vector row = new Vector();
for (int i = 1; i <= this.getColumnCount(tableName); i++) {
String resultString = result.getString(i);
if (result.wasNull()) {
resultString = "NULL";
} else {
resultString = result.getString(i);
}
row.addElement(resultString);
}
table.addElement(row);
}
} catch (SQLException e) {
e.printStackTrace();
}
return table;
}
我的问题是为什么带线程的方法比不带线程的方法快得多?我不在程序中的任何地方使用多线程。我在网上查了一下,但似乎没有什么可以回答我的问题。
任何人可以提供的任何信息将不胜感激。我是线程 XO 的菜鸟
如果您需要任何其他附加信息来帮助了解正在发生的情况,请告诉我!
答案:
看看亚伦的回答,这根本不是线程的问题。我现在感觉很菜鸟:(。谢谢@Aaron!
最佳答案
我认为您所做的似乎是为了使数据库加载速度更快,因为 VectorizeView
方法在数据加载之前返回。然后加载将在后台进行,并在(可能)与之前相同的时间完成。
您可以通过在 thread.start()
调用后添加 thread.join()
调用来测试这一理论。
如果发生这种情况,您可能需要采取一些措施来阻止应用程序的其他部分在加载完成之前访问 table
对象。否则,如果用户在启动后过早执行某些操作,您的应用程序可能会表现不正确。
FWIW,从数据库加载 100 或 500 条记录应该很快,除非查询本身对于数据库来说很昂贵。从表中进行简单的选择不应该是这种情况......除非您实际上是从 View 而不是表中进行选择,并且 View 设计得很糟糕。无论哪种方式,您可能最好关注为什么这样一个简单的查询花费这么长时间,而不是尝试在单独的线程中运行它。
<小时/>在您的后续文章中,您说在 start
之后具有 join
的版本与没有它的版本一样快。
我的第一 react 是:“将 join
保留在那里。您已经解决了问题。”
但这并不能解释实际发生的情况。我现在完全困惑了。我能想到的最好的情况是,您的应用程序在当前线程上执行此操作之前所做的事情是导致此问题的原因。
也许您应该调查应用程序在发生这种情况的期间正在做什么。看看您是否能弄清楚所有时间都花在哪里了。
关于java - 为什么单线程使我的 Java 程序速度如此之快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6672761/
此代码似乎在启用优化的广泛使用的编译器上中断,尽管它在 Visual Studio 中运行良好。 struct foo { foo(int a) { s[0] = '0'+a%10;s[1]
我想要一个图表,其中有一个单线箭头,如下所示: 1 2 3 4 5 或者像这样(其中/假设是一个箭头:)): \/ -----------------
我正在为 Java 编写自定义规则。有两个 Tree.KIND 实例(STRING_LITERAL 和 ASSIGNMENT)需要捕获。有一个特定的行,字符串文字和赋值的逻辑都会引发问题。但 Sona
Rosettacode.org 在 Ruby 中有这个出色的单行 FizzBuzz 解决方案。 1.upto(100){|n|puts'FizzBuzz '[i=n**4%-15,i+13]||n
很多时候我使用了这个命令,它在当前目录打开了一个临时的 HTTP 服务器: python3 -m http.server 现在我需要接收文件,有没有打开ftp服务器的一行命令? 我只是在寻找一个命令行
相关主题 std::unique_ptr, deleters and the Win32 API 要将 Win32 句柄用作 RAII,我可以使用以下行 std::unique_ptr::type,
我认为必须有一个单行 Guava 解决方案来将一个不可变列表转换为另一个不可变列表,但我找不到它。假设我们有以下对象: ImmutableList input = ImmutableList.of("
我有以下 Highcharts ( http://www.highcharts.com ) 散点图。请注意,轴从 -10 开始,到 10 停止,中间为 0。我希望每条 0 线的宽度或颜色都与其他线不同
我有一个项目需要将一个视频文件与另一个音频文件合并。预期的输出是一个视频文件,其中包含来自实际视频的音频和合并后的音频文件。输出视频文件的长度将与实际视频文件的大小相同。 是否有单行 FFMPEG 命
我在 python3 类中有 2 个列表: self.keys = ["a","b","c","d"] self.values = [1,2,3,4] len(self.keys) == len(se
我有一个不同长度的数组列表,我想将它们组合成一个最大维度的矩阵,并在末尾填充零。例如(伪代码): combine( [1,2,3], [4,5]) [[1,2,3],[4,5,0]] 这是我目前的解决
例如,给定 i=5 和 n=8,我想生成 [0;0;0;0;1;0; 0;0]。具体来说,我想生成向量 v 以便: v = zeros(n,1); v(i) = 1; 有没有一种(合理的)方法可以在一
我是一名优秀的程序员,十分优秀!