D.S*_*nap 2 java concurrency multithreading http-post
我想向"test.com"发送一个从0到100的请求,我的代码将每秒发送一个请求......这样程序将需要100秒才能完成.
我想要做的是设置10个线程同时运行,使线程1从(0,10); 线程2从(10,20)开始...依此类推,这样程序只需要10秒左右才能完成,这可能吗?怎么能成功呢?
import java.io.InputStreamReader;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
public class Palomo implements Runnable {
String url = "http://test.com";
HttpClient client = null;
PostMethod method = null;
BufferedReader br = null;
String contents = null;
public void run() {
for (int i = 0; i <= 100; i++) {
synchronized (this) {
doPost(i);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void doPost(int i) {
try {
client = new HttpClient();
method = new PostMethod(url);
this.method.addParameter("myPostRequest", Integer.toString(i));
client.executeMethod(method);
} catch (Exception e) {
e.printStackTrace();
} finally {
method.releaseConnection();
}
}
public static void main(String[] args) {
new Thread(new Palomo()).start();
}
}
Run Code Online (Sandbox Code Playgroud)
非常感谢 !
编辑
阅读你给我的指示,我创造了这个可怕的怪物......
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SimpExec {
public static void main(String args[]) {
ExecutorService es = Executors.newFixedThreadPool(4);
es.execute(new MyThread("A"));
es.execute(new MyThread("B"));
es.execute(new MyThread("C"));
es.execute(new MyThread("D"));
es.shutdown();
}
}
class MyThread implements Runnable {
String name;
MyThread(String n) {
name = n;
new Thread(this);
}
public void run() {
if (name=="A"){
for (int i=1;i<=10;i++){
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if (name=="B"){
for (int i=10;i<=20;i++){
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if (name=="C"){
for (int i=20;i<=30;i++){
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if (name=="D"){
for (int i=30;i<=40;i++){
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这可能是你看过的最糟糕的代码片段,但是正在制作我想要的代码,如果你能给我一些关于如何以正确的方式实现这一目标的指示,这将是非常好的.
感谢您的所有伟大建议
小智 5
您应该查看为实现此类事情而创建的ExecutorService.
您可以使用创建10个线程的池,Executors.newFixedThreadPool(10);然后提交Runnable要执行的任务().池负责在线程之间调度任务.