如何让客户端在函数中睡眠?

时间:2015-05-12 12:48:20

标签: java rmi

我在客户端调用的函数上有一个线程池...只使(n)个客户端执行此函数upload()而其他客户端等待..我试图在实现中调用sleep()功能,但它没有工作...... 注意:我这样做是为了有时间看到其他客户端没有执行该功能,而有(n)个客户端执行它...

我需要快速帮助..

服务器代码:

public class Server extends UnicastRemoteObject implements ExcutorInterface
{
public Server()throws RemoteException
{
    System.out.println("Server is in listening mode");
}

public static void main(String arg[]) throws InterruptedException
{
    try{
    LocateRegistry.createRegistry(1234);
    Server p=new Server();
    Naming.bind("//127.0.0.1:1234/obj",p);
    }catch(Exception e)
    {
    System.out.println("Exception occurred : "+e.getMessage());
    }     
}
@Override
public void executeJob()  throws RemoteException {
    System.out.println("Inside executeJob...");
    doJob a=new doJob("req_id","usrname","pwd");
    ExecutorService threadExecutor = Executors.newFixedThreadPool(2);
    threadExecutor.execute(a);
    threadExecutor.shutdown(); 
}

}

doJob的代码:

public class doJob implements Runnable {
String request_id="", usrnamee="", pswd="";
public static int i = 1;

public doJob(String request_id,String usrnamee,String pswd) {
    this.request_id=request_id;
    this.usrnamee=usrnamee;
    this.pswd=pswd;
}
public void upload() throws InterruptedException, IOException {
     Thread.sleep(1000*15);
  }
 public void run() {
            upload();
  }

}

我在客户端

中调用executeJob();

4 个答案:

答案 0 :(得分:0)

要详细说明我的评论,你应该在try / catch中包围Thread.sleep,并确保线程只要你愿意就睡觉。它看起来像这样:

long wakeTime = new Date().getTime() + (1000 * 15);
while ((new Date()).getTime() < wakeTime) {
    try {
        Thread.sleep(1000*15);
    } catch (InterruptedException e) {
        // do nothing
    }
}

我怀疑你的线程因为信号而提前醒来,可能是因为你在threadExecutor.execute(a)之后立即调用了threadExecutor.shutdown()。您可能还需要考虑调用threadExecutor.awaitTermination()。

在得知任务永远不会执行后进行编辑:

因为threadExecutor.shutdown()没有等待任务完成,所以看起来你的程序会立即退出。你应该在调用threadExecutor.shutdown()之后尝试使用threadExecutor.awaitTermination(),将它放在一个类似于为Thread.sleep()建议的循环中。

答案 1 :(得分:0)

一个建议是使“threadExecutor”成为静态成员变量 服务器。 如果您只想要n个客户端,那么使该池有n个线程 ExecutorService threadExecutor = Executors.newFixedThreadPool(n);

在执行方法ID中关闭似乎不正确。

只有在您决定关闭游戏时,才应关闭游戏池 服务器

直到它应该存活并处理客户端请求。 所以你必须删除shutdown和newFixedThreadPool语句 超出executeJob方法。

答案 2 :(得分:0)

摆脱线程池并使用计数信号量来控制上传的内联执行。

答案 3 :(得分:-1)

我希望Thread.sleep()能帮助您解决问题。 您也可以使用wait()。