public class NumberAdd extends AbstractProcessor { public static int sumValue; private static Object lockObject = new Object(); public NumberAdd(String name) { super(name); } @Override protected void action() throws Exception { for (int i = 0; i < 1000; i++) { add(); Thread.sleep(1); } } private static void add() { synchronized (lockObject) { sumValue++; } }}上面的程序是一个类,它用于把sumValue中的值增加1000。 下面是测试用例
public void testStart() { MultiThreadProcessor processors = new MultiThreadProcessor("number add"); for (int i = 0; i < 10; i++) { processors.addProcessor(new NumberAdd("add" + i)); } long startTime = System.currentTimeMillis(); processors.start(); long endTime = System.currentTimeMillis(); logger.log(LogLevel.INFO, "执行时间:{}", endTime - startTime); assertEquals(10000, NumberAdd.sumValue); }启动了10个线程来执行添加操作,因为每个线程添加1000,最终应该是添加30000才对。 最终的执行结果:
-0 [main] INFO - 线程组并且测试用例也执行通过,说明最终的结果,确实是加了30000次。 而且是在线程组执行完毕后,才执行的assertEquals语句。 从此,写多线程协作就像写普通程序一样了。(注意是像,不是是,因为还是要注意冲突对象的同步问题的)运行开始,线程数10...-5 [number add-add0] INFO - 线程 运行开始...-6 [number add-add4] INFO - 线程 运行开始...-6 [number add-add3] INFO - 线程 运行开始...-6 [number add-add1] INFO - 线程 运行开始...-6 [number add-add2] INFO - 线程 运行开始...-6 [number add-add7] INFO - 线程 运行开始...-7 [number add-add8] INFO - 线程 运行开始...-7 [number add-add5] INFO - 线程 运行开始...-7 [number add-add6] INFO - 线程 运行开始...-7 [number add-add9] INFO - 线程 运行开始...-1023 [number add-add6] INFO - 线程 运行结束-1023 [number add-add1] INFO - 线程 运行结束-1024 [number add-add9] INFO - 线程 运行结束-1024 [number add-add2] INFO - 线程 运行结束-1025 [number add-add5] INFO - 线程 运行结束-1029 [number add-add7] INFO - 线程 运行结束-1029 [number add-add4] INFO - 线程 运行结束-1030 [number add-add0] INFO - 线程 运行结束-1030 [number add-add3] INFO - 线程 运行结束-1031 [number add-add8] INFO - 线程 运行结束-1031 [main] INFO - 线程组 运行结束, 用时:1026ms-1032 [main] INFO -