早速やってみました。クライアント クラスのラッパー オブジェクトを作成し、この新しいオブジェクトを実行可能にします。
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
変数を使用できます。executor service
やthread pools
なども使えます。
注: このコードはアイデアの説明として書いたもので、さまざまな方法でコードを改善できます。