通过countDownLatch 计数器,来控制线程数及等待 释放
import com.base.api.CountDownLatchService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
@Service
public class CountDownLatchServiceImpl implements CountDownLatchService {
private static final Logger logger = LoggerFactory.getLogger(CountDownLatchServiceImpl.class);
//定义定义countDownLatch 计数器
private static CountDownLatch countDownLatch = null;//new CountDownLatch(3);
List<String> list1;
List<String> list2;
List<String> list3;
public class Thread1 extends Thread
{
/*
//带参数
private String id;
public ShiYeThread(String id)
{
this.id = id;
}*/
@Override
public void run() {
try {
list1 = new ArrayList<String>();
for (int i = 0; i< 10; i++)
{
list1.add("Thread1_" + String.valueOf(i));
}
Thread.sleep(3 * 1000);
} catch (Exception e) {
logger.error("Thread1失败",e);
}
finally {
//释放
countDownLatch.countDown();
}
}
}
public class Thread2 extends Thread
{
/*
//带参数
private String id;
public ShiYeThread(String id)
{
this.id = id;
}*/
@Override
public void run() {
try {
list2 = new ArrayList<String>();
for (int i = 0; i< 10; i++)
{
list2.add("Thread2_" + String.valueOf(i));
}
Thread.sleep(5 * 1000);
} catch (Exception e) {
logger.error("Thread2失败",e);
}
finally {
countDownLatch.countDown();
}
}
}
public class Thread3 extends Thread
{
/*
//带参数
private String id;
public ShiYeThread(String id)
{
this.id = id;
}*/
@Override
public void run() {
try {
list3 = new ArrayList<String>();
for (int i = 0; i< 10; i++)
{
list3.add("Thread3_" + String.valueOf(i));
}
Thread.sleep(3 * 1000);
} catch (Exception e) {
logger.error("Thread1失败",e);
}
finally {
countDownLatch.countDown();
}
}
}
@Override
public List<String> TestThread() {
try {
countDownLatch = new CountDownLatch(3);
long start = System.currentTimeMillis();
new Thread1().start();
//带参数 主线程等待
//new ShiYeThread("1").start();
new Thread2().start();
new Thread3().start();
countDownLatch.await();
float exc = (float) (System.currentTimeMillis() - start) / 1000;
logger.error("TestThread Elapsed time: " + exc + " seconds");
list1.addAll(list2);
list1.addAll(list3);
return list1;
}
catch (InterruptedException e)
{
logger.error("TestAsyncTask",e);
}
return null;
}
}