我在客户端调用的函数上有一个线程池...只使(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();
答案 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()。