クラスオブジェクト(ソケット接続を処理する)をロックし、それらのオブジェクトを処理のためにスレッドに渡す必要があります。あるスレッドでJavaのロックを解除し、別のスレッドでロック解除
public class Client{
protected Socket socket;
...
public Lock lock = new ReentrantLock();
}
私は、作業を処理する単純なワーカークラスを持っています。
public class ClientWriterWorker extends Runnable{
protected Client client;
protected String data;
public ClientWriterWorker(Client client, String data){
this.client = client;
this.data = data;
}
@Override
public void run(){
// do the processing
this.client.write(this.data);
// release the lock?
this.client.lock.unlock(); // does not work
}
}
私はロックされていないクライアントを取得し、ロックしてスレッドに渡すループを持っています。
Client currentClient = null;
while(true){
for(Client client : clients){
if(client.lock.tryLock()){
// we have the lock
currentClient = client;
break;
}
}
if(currentClient != null){
break;
}
}
new Thread(new ClientWriterWorker(currentClient, "some data")).start();
別のスレッドでロックを解除することはできますか?私のデザインに欠陥がありますか?
Javaがそれをやっても、ロックの原則に反する。ロックは、そのオブジェクトには関係ないスレッドによって保持されることを意味し、完了すると、他のスレッドが同じことをするオブジェクトを解放します – Jeeter