我正在尝试在java中创建服务器 - 客户端套接字程序(TCP)。 在我的客户端程序中,我创建了10个线程,这10个线程将作为一个单独的客户端,当它运行时,它连接到服务器端的套接字。
现在,我希望线程应该在随机时间开始,然后在随机时间进入睡眠状态,然后再从睡眠状态恢复。这种随机化是因为我在localhost上运行客户端和服务器程序,所以我希望线程应该表现得像许多用户在任何时刻访问单个服务器(比如我们有谷歌)。
我对此没有任何解决方案......请帮助我并提出一些我可以尝试的建议。
我已经尝试了计时器和 TimerTask 类...但是它没有满足我的需要.. Timer类按顺序执行其分配的任务..不是随机的方式..
有没有任何解决方案,而不是计时器和 TimerTask 。
答案 0 :(得分:2)
您可以使用具有固定线程池大小的scheduled executor,它在随机时间休眠,最初在随机时间开始:
import java.util.Random;
import java.util.concurrent.*;
public class Client{
private final static ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
public static void main(String[] args) {
final Random random = new Random();
final long maxSleepTime=2000L;
for (int i = 0; i < 10; i++) {
int randomSleepTime = random.nextInt((int) maxSleepTime);
Runnable command=new Runnable() {
@Override public void run() {
//code to run, e.g. call a server method
}
};
executor.scheduleAtFixedRate(command,randomSleepTime,randomSleepTime, TimeUnit.MILLISECONDS);
}
}
}
答案 1 :(得分:0)
这个例子使用一个包含10个线程的执行器......我们的想法是提交你的任务,执行者将为你处理线程。
public class Test {
private final Executor executor= Executors.newFixedThreadPool(10);
public void executeTask(Runnable task){
executor.execute(task);
}
public static void main(String[] args) {
Test test= new Test();
for(int i=0;i<100;i++){
final int iteration=i;
Runnable task=(new Runnable() { public void run() {System.out.println("Executing task "+iteration); }});
test.executeTask(task);
}
}
}
答案 2 :(得分:0)
非常直接的解决方案可能如下所示:
调用Thread.sleep(sleepTime);
,而sleepTime
是随机生成的。
import java.util.Random;
public class Client extends Thread
{
boolean run = true;
public void run() {
Random rnd = new Random();
try {
while(run == true) {
// ..
// Do whatever a client does ..
// ..
Integer sleepTime = rnd.nextInt(100);
Thread.sleep(sleepTime);
System.out.println("Slept for " + sleep + "ms");
// Replace this by an appropriate condition
if(sleep > 50) {
System.out.println("I'm out ..");
run = false;
}
}
} catch(InterruptedException v) {
System.out.println(v);
}
}
}
public class Main{
public static void main(String []args){
Client client = new Client();
client.run();
}
}