线程池优化
线程池队列如何解决多线程
开启的线程数过多可能会导致内存溢出宕机,所以用线程池控制线程数,把线程放到线程池中,形成队列依次执行,顺序的问题根据线程池调度策略
线程池类型分三类:
newCachedThreadPool、newFixedThreadPool、newSingleThreadExecutor
主要类:Executors
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
//可以最大开65536, 短任务
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
//按照固定的数目
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(50);
//默认一个
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
// for (int i = 0; i < 10; i++) {
// final int index = i;
// //放了十个线程
// fixedThreadPool.execute(new Runnable() {
// public void run() {
// System.out.println(index+Thread.currentThread().getName());
// }
// });
// }
// fixedThreadPool.shutdown();
//
// //延迟持续,重复执行
// ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
// scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
// @Override
// public void run() {
// System.out.println("111111");
// }
// },0,1,TimeUnit.SECONDS);
for (int i = 0; i < 2; i++) {
final int index=i;
fixedThreadPool.execute(new Thread() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" "+index);
}
});
}
fixedThreadPool.shutdown();
}
}
api整合线程池
一台电脑能开多少线程问题
• 一个进程可以开启的线程受可用内存限制,如果是32 位的机器,那么默认一个进程有2G的可用内存,而每 个线程默认分析1M的栈空间,所以这种情况下理论最 线程数在2000多个。一个解决办法是创建线程时减少 线程栈的大小或是使用64位的系统。64位系统应该可 以忽略这个问题了。
• 当然受cpu及磁盘速度及物理内存的限制。不用到达 上限值,你的机器应该已经是慢如牛车了。
tomcat使用相关问题
问题1 闪退问题
点击右键编辑startup.bat在最开始的地方添加下面两行:
SET JAVA_HOME=C:\Program Files (x86)\Java\jdk1.8.0_45(jdk目录)
SET CATALINA_HOME=D:\apache-tomcat-8.0.24(tomcat目录)
问题2:启动窗口乱码,默认都是UTF-8的,但是控制台是GBK的,要保持一致
打开tomcat目录下的conf/目录下logging.properties
找到
java.util.logging.ConsoleHandler.encoding = utf-8这行
更改为
java.util.loggingng.ConsoleHandler.encoding = GBK
问题3:启动时候报这样的警告:
警告 [main] org.apache.catalina.webresources.Cache.getResource
无法将位于[/WEB-INF/classes/templates/framework/help/helpinfo.html]的资源添加到Web应用程序[/zhfx]的缓存中,
因为在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间。
解决办法:
在 /conf/context.xml 的 前添加以下内容(大小默认是1024,单位是KB):
问题4:端口号
conf/目录下server.xml
8009 8080 8005
问题4:线程优化
conf/目录下server.xml
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="400" minSpareThreads="4"/>
问题5 内存优化
bin/catalina.bat
查找:----- Execute The Requested Command -----------------------------------------
JAVA_OPTS -server -Xms768m -Xmx768m - XX:+HeapDumpOnOutOfMemoryError
注意tomcat不要放在带中文路径文件夹
数据库调优
• ##查询数据库当前设置的最大连接数
• show variables like ‘%max_connections%’;
• ##重新设置
• set global max_connections=1500;
jenkins安装
• jenkins.war 放tomcat
• 启动 访问地址
• http://127.0.0.1:8080/jenkins/
• 实际安装 配置路径
• /当前用户/.jenkins
jenkins插件问题
修改插件下载地址,将远程插件下载地址改成清华网,替换default.json文件(替换目录C:\Users\wys.jenkins\updates\)
链接:https://pan.baidu.com/s/1RS-AvQ0qxWQQVfKxxiRfew
提取码:lk3t
替换后如果插件还是下载不下来,直接使用已经下好的插件包,做替换(替换目录C:\Users\wys.jenkins\plugins)
链接:https://pan.baidu.com/s/1mcMQbnSQaisyYL-z4NkF2g
提取码:t6lm
重启tomcat,然后访问jenkins (http://localhost:8080/jenkins)
下载maven插件
如果使用上面的插件包,里面包含了maven插件包,没有安装可以手动安装maven integration
maven环境配置
jenken项目构建
第一步:新建项目
第二步:源码拉取
第三步:定时构建设置
• 第一颗*表示分钟,取值0~59
• 第二颗*表示小时,取值0~23
• 第三颗*表示一个月的第几天,取值1~31
• 第四颗*表示第几月,取值1~12
• 第五颗*表示一周中的第几天,取值0~7,其中0和7代表的都是周日
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0c8dly4Z-1590558513697)(Day9.assets/image-20200507173103038.png)]
自动化例子
• 1.每30分钟构建一次:
• H/30 * * * *
• 2.每2个小时构建一次
• H H/2 * * *
• 3.每天早上8点构建一次
• 0 8 * * *
• 4.每天的8点,12点,22点,一天构建3次
• 0 8,12,22 * * *
第四步:构建环境
maven build
第五步:保存,运行项目
从控制台可以看出,首先从远程svn 拉取项目到本地的.jenkins/workspaces目录下,然后执行项目的pom.xml文件,然后打包编译到target目录下,然后执行命令java -jar xxx.jar文件。
xxx.jar文件名可以在pom.xml中修改打包文件名.
小课堂
git github gitlab (git是客户端,github gitlab是git服务器)
svn svn服务器
白盒测试TestNg和Junit
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.1.0</version>
</dependency>
testng插件的安装
TestNg插件安装 好处:新建testng类有模板,且运行时有testng方式
junit和testng对比
setup相当于BeforMethod
tearDown相当于AfterMethod,每个@Test方法执行后都会执行
testng详细学习请看下帖:
http://www.yiibai.com/testng/junit-vs-testng-comparison.html
testng高级用法
数据驱动
object[ ] [ ]用法
可以理解为二维数组,比如数据库表table的行和列,第一个【】代表行,第二个【】代表列,使用时循环行,同时注意列的类型和个数 要和使用时一致,不然后报参数错误
list<object[]>
import java.util.Vector;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DataProviderTest1 {
@Test(dataProvider = "testdb")
public void parameterIntTest(Class clzz, String str,String line3) {
System.out.println("Parameterized Number is : " + clzz);
System.out.println("Parameterized Number is : " + str);
}
//This function will provide the patameter data
@DataProvider(name = "testdb")
public Object[][] parameterIntTestProvider() {
return new Object[][]{
{Vector.class, "test1","a"},
{String.class, "test2","b"},
{Integer.class, "test3","c"}
};
}
}
Iterator<Object[]>用法会更广泛
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class DataProviderTest2 {
@Test(dataProvider = "mytest")
public void parameterIntTest(TestBean bean,int i) {
System.out.println("Parameterized Number is : " + bean.getName());
System.out.println("Parameterized Number is : " + bean.getMsg());
}
@DataProvider(name = "mytest",parallel =false)
public Iterator<Object[]> parameterIntTestProvider() {
List<Object[]> dataProvider = new ArrayList<Object[]>();
for(int i=0;i<2;i++){
TestBean bean = new TestBean();
bean.setName("testname");
bean.setMsg("--"+i);
dataProvider.add(new Object[] { bean,i});
}
return dataProvider.iterator();
}
}
支持并行测试
parallel=true
中文问题 -Dfile.encoding=UTF-8
线程池 threadPoolSize = 1
重复执行 invocationCount=100