Day9(线程池优化、tomcat使用问题、数据库调优、jenkins安装及项目构建、Junit和TestNg对比、testNg高级应用(数据驱动、支持并行测试) )

线程池优化

线程池队列如何解决多线程

开启的线程数过多可能会导致内存溢出宕机,所以用线程池控制线程数,把线程放到线程池中,形成队列依次执行,顺序的问题根据线程池调度策略

线程池类型分三类:

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整合线程池
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ZP3RdQI-1590559705740)(Day9.assets/image-20200527140803201.png)]

一台电脑能开多少线程问题

• 一个进程可以开启的线程受可用内存限制,如果是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环境配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fp1QX52S-1590558513686)(Day9.assets/image-20200507170911337.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8RONvntD-1590558513691)(Day9.assets/image-20200507170851015.png)]

jenken项目构建

第一步:新建项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GpZzoiSm-1590558513692)(Day9.assets/image-20200507172406643.png)]

第二步:源码拉取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rV5CdT9T-1590558513694)(Day9.assets/image-20200507172648870.png)]

第三步:定时构建设置

• 第一颗*表示分钟,取值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 * * *

第四步:构建环境

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cJYqkCG7-1590558513699)(Day9.assets/image-20200507173919848.png)]

maven build

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0JnV65Zj-1590558513701)(Day9.assets/image-20200507174027640.png)]

第五步:保存,运行项目

从控制台可以看出,首先从远程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插件的安装

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R7LKkrWs-1590558513703)(Day9.assets/image-20200507201531859.png)]

TestNg插件安装 好处:新建testng类有模板,且运行时有testng方式

junit和testng对比

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X8C9fuNU-1590558513705)(Day9.assets/image-20200508092046243.png)]

setup相当于BeforMethod

tearDown相当于AfterMethod,每个@Test方法执行后都会执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gyk0H2Y9-1590558513706)(Day9.assets/image-20200508092536349.png)]

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值