...
| Code Block | ||
|---|---|---|
| ||
class StopSocket implements Runnable {
private final Socket socket;
private volatilefinal boolean done = falseBufferedReader in;
private public void shutdown() {
volatile boolean done = truefalse;
}
public void runStopSocket() {
trythrows IOException {
this.socket = new Socket("somehost", 25);
this.in = BufferedReader br = new BufferedReadernew BufferedReader(new InputStreamReader(this.socket.getInputStream()));
}
private final StringObject stringlock = new nullObject();
public while (!done && (string = br.readLine()) != null) { void run() {
String string;
try {
// Blocks until end of stream (null)
synchronized (this.lock) {
while (!this.done && }
(string = this.in.readLine()) != }null) catch{
(IOException ie) {
// ForwardBlocks tountil handler
end of stream }
(null)
}
public}
static void main(String[] args) throws IOException, InterruptedException } catch (IOException ie) {
StopSocket ss// =Forward new StopSocket();
to handler
}
Thread thread}
= new Thread(ss);public void shutdown() {
thread.start();this.done = true;
}
public Thread.sleep(1000);
static void main(String[] args) throws IOException, InterruptedException {
StopSocket ss.shutdown = new StopSocket();
}
}
Thread thread = new Thread(ss);
thread.start();
Thread.sleep(1000);
ss.shutdown();
}
}
|
Noncompliant Code Example (blocking IO, interruptible)
...
| Code Block | ||
|---|---|---|
| ||
class StopSocket implements Runnable {
private volatile Socket socket;
// ...
public void run() {
String string;
try {
socketsynchronized = new Socket("somehost", 25);
(this.lock) {
BufferedReader br = newwhile BufferedReader(new InputStreamReader(socket.getInputStream()));
String string = null;
while (!Thread.interrupted() && (string = br.(!Thread.interrupted() && (string = this.in.readLine()) != null) {
// Blocks until end of stream (null)
}
}
} catch (IOException ie) {
// Forward to handler
}
}
public static void main(String[] args) throws IOException, InterruptedException {
StopSocket ss = new StopSocket();
Thread thread = new Thread(ss);
thread.start();
Thread.sleep(1000);
thread.interrupt();
}
}
|
...
| Code Block | ||
|---|---|---|
| ||
class StopSocket implements Runnable {
private volatile Socket socket; // Socket needs to be shared
// ...
public void shutdownrun() { throws
IOException {
String string;
if (socket != null)try {
socket.close();synchronized (this.lock) {
}
}
while ((string public void run(= this.in.readLine()) != null) {
try {
// Blocks until socketend =of newstream Socket("somehost", 25);(null)
BufferedReader br =}
new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
String string = null; } catch (IOException ie) {
while ((string = br.readLine()) != null) { // Forward to handler
} finally {
try {
// Blocks until end of stream shutdown(null);
}
catch } catch (IOException ie(IOException e) {
// Forward to handler
} finally {}
}
try {}
public void shutdown();
throws IOException {
} catch (IOException e) { this.socket.close();
}
public static void main(String[] args) // Handle the exception
}
}
}
public static void main(String[] args) throws throws IOException, InterruptedException {
StopSocket ss = new StopSocket();
Thread thread = new Thread(ss);
thread.start();
Thread.sleep(1000);
ss.shutdown();
}
}
|
...
| Code Block | ||
|---|---|---|
| ||
class StopSocket implements Runnable {
private final publicSocketChannel void run() {
while (!Thread.interrupted()) {
trysc;
public StopSocket() throws IOException {
InetSocketAddress addr = new InetSocketAddress("somehost", 25);
this.sc = SocketChannel.open(addr);
}
private final Object lock = new Object;
public void run() {
ByteBuffer buf InetSocketAddress addr = new InetSocketAddress("somehost", 25ByteBuffer.allocate(1024);
try {
SocketChannel sc =synchronized SocketChannel.open(addr);(this.lock) {
ByteBuffer buf = ByteBuffer.allocate(1024);
while (!Thread.interrupted()) {
this.sc.read(buf);
// ...
}
}
} catch (IOException ie) {
// HandleForward theto exceptionhandler
}
}
}
public static void main(String[] args) throws IOException, InterruptedException {
StopSocket ss = new StopSocket();
Thread thread = new Thread(ss);
thread.start();
Thread.sleep(1000);
thread.interrupt();
}
}
|
...