如何正确引用AtomicBoolean对象?

时间:2017-07-17 04:37:14

标签: java multithreading concurrency boolean java.util.concurrent

我有一个用AtomicBoolean(设置为true)初始化的线程类。

public class WThread implements Runnable {   

private Socket _listenerSocket;
private BufferedReader _br;
private final AtomicBoolean _isRunning;

private final AtomicBoolean _isRunning;    

public WThread(Socket listenerSocket, AtomicBoolean isRunning) {
        _listenerSocket = listenerSocket;
        _isRunning = isRunning;
    }   
}

public void run() {
    try {
        System.out.println("Starting a worker thread.");
        _br = new BufferedReader(new InputStreamReader(_listenerSocket.getInputStream()));
        _command = _br.readLine();
        dispatchCommand(_command);
    } catch (IOException e) {

    }
    finally {
        try {
            _listenerSocket.close();
        } catch (IOException e) {

        }
    }
}


private void dispatchCommand(String _command) {
        switch(_command) {
            case "fail":
                fail();
                break;
            default:
                break;
        }
}

private void fail() {
    System.out.println("Failed node.");
    _isRunning.set(false);
    try {
        _listenerSocket.close();
    } catch (IOException e) {

    }
}

稍后,在同一个类中,我将该布尔值设置为false ...

_isRunning.set(false);

由于某种原因,似乎引用不起作用,并且原始的AtomicBoolean永远不会被设置,因为在父线程中不会发生某些预期的操作。

这是父类,无法打印“失败”:

public class ParentThread implements Runnable {
  private ExecutorService _executor = null;
  private final AtomicBoolean _isRunning = null;

   public ParentThread(ExecutorService executor, AtomicBoolean isRunning)(
        _executor = executor;
        _isRunning = isRunning;
   }

   public void run() {
    try {
        while(_isRunning.get()) {
            _executor.submit(new WThread(_isRunning));
        }
        if (!_isRunning.get()) {
            System.out.println("Fail.");
            _executor.shutdownNow();
        }
    } catch (IOException e) {

    }
   }
}

0 个答案:

没有答案