多线程对速度的提升测试
本文主要使用javaFX程序来测试多线程对速度的提升测试。在开发中,将主要任务放在主线程中,如渲染页面,将辅助功能放在其他线程中,如获取数据等。这样提升用户的体验,提高程序的运行速度。最起码给用户特别畅快的体验。
本文将从使用多线程和不使用多线程两个方向来测试多线程对程序运行的体验提升测试;
不使用多线程
下面属于javafx基于fxml的辅助开发。直接上程序
Main.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: grey;" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.xidu.fxml.MainController">
<children>
<ComboBox fx:id="comboBox" layoutX="77.0" layoutY="129.0" prefWidth="150.0" />
</children>
</AnchorPane>
Main.java
package com.xidu.fxml;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.net.URL;
public class Main extends Application {
@Override
public void start(Stage stage) throws Exception {
FXMLLoader fx=new FXMLLoader();
URL url = fx.getClassLoader().getResource("com/xidu/fxml/main.fxml");
fx.setLocation(url);
Parent root = fx.load();
stage.setTitle("多线程速度测试");
Scene scene =new Scene(root);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
MainController.java
package com.xidu.fxml;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import java.util.ArrayList;
import java.util.List;
public class MainController{
@FXML
public ComboBox comboBox;
//页面加载函数
@FXML
private void initialize(){
//启动时间
long start = System.currentTimeMillis();
//使用ArrayList集合存储地址;
List<String> addressList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
try {
//每运行一次,休眠100毫秒,模仿网络延迟
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
addressList.add("北京"+i);
}
//将地址添加进下来菜单中
comboBox.getItems().addAll(addressList);
//启动结束时间
long end = System.currentTimeMillis();
System.out.println("启动程序共使用"+(start-end)+"毫秒");
}
public MainController() {
}
public MainController(ComboBox comboBox) {
this.comboBox = comboBox;
}
}
运行结果
启动程序共使用-1004毫秒
使用 多线程进行优化
添加SpringContextMap.java
import java.util.HashMap;
import java.util.Map;
public class SpringContextMap {
//定义静态变量储存静态变量
public static Map contextMap = new HashMap<>();
}
添加AddComboBoxThread.java
import javafx.scene.control.ComboBox;
import java.util.ArrayList;
import java.util.List;
public class AddComboBoxThread implements Runnable {
@Override
public void run() {
MainController mainController = (MainController) SpringContextMap.contextMap.get("mainController");
ComboBox comboBox = mainController.comboBox;
//使用ArrayList集合存储地址;
List<String> addressList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
try {
//每运行一次,休眠100毫秒,模仿网络延迟
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
addressList.add("北京"+i);
}
//将地址添加进下来菜单中
comboBox.getItems().addAll(addressList);
}
}
修改MainController.java
package com.xidu.fxml;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import java.util.ArrayList;
import java.util.List;
public class MainController{
@FXML
public ComboBox comboBox;
//页面加载函数
@FXML
private void initialize(){
//启动时间
long start = System.currentTimeMillis();
//构造控制函数,并将mainController存储进入静态变量contextMap;这也是Spring存储对象的一种方式
MainController mainController = new MainController(comboBox);
SpringContextMap.contextMap.put("mainController",mainController);
//新建线程,传入AddComboBoxThread(),并启动
Thread thread = new Thread(new AddComboBoxThread());
thread.start();
//启动结束时间
long end = System.currentTimeMillis();
System.out.println("启动程序共使用"+(start-end)+"毫秒");
}
public MainController() {
}
public MainController(ComboBox comboBox) {
this.comboBox = comboBox;
}
}
运行结果
启动程序共使用-1毫秒
总结
程序中使用了Thread.sleep(),来模仿实际开发中的网络延迟,这在实际开发中可以是读取后台数据,当存在大批量的数据时,就会存在这种情况;
可以看出原来程序的启动速度为1004毫秒,使用多线程进行优化以后,程序启动速度为1毫秒,程序启动以后,展示主页面以后,剩下的任务交给其他线程去做。