纳尼。。什么意思,你要把那一块做成多线程并发,你得说清楚啊 比如while里面都做成多线程并发就是这样:int index = 1; int client_num = 1000; while(index < client_num){ System.out.println(index + " = " + client_num); new Thread(new Runnable(){ public void run() { // 业务逻辑处理 ServiceConfigBean config = new ServiceConfigBean(); int NO = (int) (Math.random() * 100) + 1; config.setServiceID("service" + NO); config.setVersion("1.0"); config.setIp("192.168.1.100"); config.setPort(index); config.setTactics(""); try { client.registerService(config); } catch (TException e) { e.printStackTrace(); } } }).start(); index++; }
嗯,就是这么个意思,不过你这样弄的话性能太低了,这样一搞就有client_num 数量级个线程了
可以先搞一个线程池,并在系统启动时已经建立好这些线程,这样既可以提高效率,又能有效控制线程的多少,代码如下:public class ServiceExecutor implements InitializingBean { //线程池大小 private final int poolSize = 20; private ExecutorService service; public ExecutorService getService() { return service; } public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException { return service.invokeAll(tasks); } public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException { return service.invokeAny(tasks); } public int getPoolSize() { return poolSize; } @Override public void afterPropertiesSet() throws Exception { service = Executors.newFixedThreadPool(poolSize); } }public class Xxxx<T>{ @Autowired private ServiceExecutor serviceExecutor;
publc void registerService(){ int index = 1; int client_num = 1000; while(index < client_num){ addService(); } } public void addService(){ Callable<T> service = new Callable<T>() {
@Override public T call() throws Exception { //逻辑..... //... client.registerService(config); return null; } }); serviceExecutor.getService().submit(service); }}
比如while里面都做成多线程并发就是这样:int index = 1;
int client_num = 1000;
while(index < client_num){
System.out.println(index + " = " + client_num);
new Thread(new Runnable(){
public void run() {
// 业务逻辑处理
ServiceConfigBean config = new ServiceConfigBean();
int NO = (int) (Math.random() * 100) + 1;
config.setServiceID("service" + NO);
config.setVersion("1.0");
config.setIp("192.168.1.100");
config.setPort(index);
config.setTactics("");
try {
client.registerService(config);
} catch (TException e) {
e.printStackTrace();
}
}
}).start();
index++;
}
//线程池大小
private final int poolSize = 20;
private ExecutorService service;
public ExecutorService getService() {
return service;
}
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException {
return service.invokeAll(tasks);
}
public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException,
ExecutionException {
return service.invokeAny(tasks);
}
public int getPoolSize() {
return poolSize;
}
@Override
public void afterPropertiesSet() throws Exception {
service = Executors.newFixedThreadPool(poolSize);
}
}public class Xxxx<T>{
@Autowired
private ServiceExecutor serviceExecutor;
publc void registerService(){
int index = 1;
int client_num = 1000;
while(index < client_num){
addService();
}
} public void addService(){
Callable<T> service = new Callable<T>() {
@Override
public T call() throws Exception {
//逻辑.....
//...
client.registerService(config);
return null;
}
});
serviceExecutor.getService().submit(service);
}}
public static void main(){
Executor executor = Executors.newFixedThreadPool(5);
Runnable task = new Runnable() {
@Override
public void run() {
while(index < client_num){
addService(); // 此行代码为毛不执行
index++;
}
}
};
executor.execute(task);
}public void addService(){
ServiceConfigBean config = new ServiceConfigBean();
int NO = (int) (Math.random() * 100) + 1;
config.setServiceID("timeStampServer" + NO);
config.setVersion("1.0");
config.setIp("192.168.1.100");
config.setPort(index);
config.setTactics("");
try {
client.registerService(config);
} catch (TException e) {
e.printStackTrace();
}
}
求解:参考上面两位大师的思路,自己弄了一下,代码如上,为毛跑不通呢,是不是写的有问题?
ServiceConfigBean config = new ServiceConfigBean();
int NO = (int) (Math.random() * 100) + 1;
config.setServiceID("service" + NO);
config.setVersion("1.0");
config.setIp("192.168.1.100");
config.setPort(8888);
config.setTactics("");
try {
dao.registerService(config); // 该行代码是执行保存注册信息的。
} catch (TException e) {
e.printStackTrace();
}其实我主要是想把这一部分的业务代码(当然业务信息可能是不同的,比如端口/IP)并发插入N次。