我试着快速尝试一下。为您的客户端类创建一个包装器对象并使这个新对象可运行。
public class ClientWrapper implements Runnable {
private final String ip;
private final String port;
private Client client;
Lock lock = new ReentrantLock();
/**
* Creates a new instance of ClientWrapper.
*
* @param ip
* @param port
*/
public ClientWrapper(String ip, String port) {
this.ip = ip;
this.port = port;
}
public Lock getLock() {
return lock;
}
/**
* {@inheritDoc}
*/
@Override
public void run() {
lock.lock();
client = new Client(ip, port);
lock.unlock();
}
//create a method to expose client or its methods.
}
现在使用这个对象的一个实例作为线程,如下所示。
import java.util.concurrent.TimeUnit;
/**
* @author rbhatt
*/
public class ClientCaller {
public static void main(String args[]) throws InterruptedException {
ClientWrapper clientWrapper = new ClientWrapper("127.0.0.1", "8080");
Thread t = new Thread(clientWrapper);
t.start();
boolean ret = clientWrapper.getLock().tryLock(250, TimeUnit.MILLISECONDS);
if (ret == false) {
System.out.println("can not acquire lock in 250 milliseconds, kill the thread.");
t.interrupt();
} else {
System.out.println("acquired lock in 250 milliseconds,release lock obtain client!");
clientWrapper.getLock().unlock();
}
}
}
如您所见,您可以在调用者中控制您的超时,而我们无法获得锁,杀死客户端包装线程。我用过中断,可以用volatile
变量。您也可以使用 aexecutor service
等thread pools
。
注意:我编写这段代码只是为了说明这个想法,可以通过许多不同的方式改进代码。