Java线程:随机启动和休眠线程

时间:2014-06-27 11:46:15

标签: java multithreading threadpool

我正在尝试在java中创建服务器 - 客户端套接字程序(TCP)。 在我的客户端程序中,我创建了10个线程,这10个线程将作为一个单独的客户端,当它运行时,它连接到服务器端的套接字。

现在,我希望线程应该在随机时间开始,然后在随机时间进入睡眠状态,然后再从睡眠状态恢复。这种随机化是因为我在localhost上运行客户端和服务器程序,所以我希望线程应该表现得像许多用户在任何时刻访问单个服务器(比如我们有谷歌)。

我对此没有任何解决方案......请帮助我并提出一些我可以尝试的建议。

我已经尝试了计时器 TimerTask 类...但是它没有满足我的需要.. Timer类按顺序执行其分配的任务..不是随机的方式..

有没有任何解决方案,而不是计时器 TimerTask

3 个答案:

答案 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();
     }
}