【发布时间】:2013-12-24 21:47:55
【问题描述】:
我在这里有一个代码,用于解释信号量是如何工作的。无论我多么努力,我都不理解下面的行以及如何调用信号量的代码。
基本上,代码试图模拟许多正在建立的连接......
import java.util.concurrent.Semaphore;
public class Connection {
private static Connection instance = new Connection();
private Semaphore sem = new Semaphore(10, true);
private int connections = 0;
private Connection() {
}
public static Connection getInstance() {
return instance;
}
public void connect() {
try {
sem.acquire();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
doConnect();
} finally {
sem.release();
}
}
public void doConnect() {
synchronized (this) {
connections++;
System.out.println("Current connections: " + connections);
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (this) {
connections--;
}
}
}
主类文件..
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class App {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newCachedThreadPool();
for(int i=0; i < 200; i++) {
executor.submit(new Runnable() {
public void run() {
Connection.getInstance().connect();
}
});
}
executor.shutdown();
executor.awaitTermination(1, TimeUnit.DAYS);
}
}
我不理解运行部分
public void run() {
Connection.getInstance().connect();
}
我们如何从上面调用连接方法?在我看来,连接输出应该始终为一个,因为正在调用新线程。令人惊讶的是,但这从未发生过。
【问题讨论】:
-
您可能希望声明
connectionsvolatile 以使其在堆栈上自动更新。你能澄清你的误解吗?您不了解代码的输出?您能否提供您得到的结果,因为它在多线程应用程序的情况下可能会有很大不同? -
代码运行良好绝对没有问题...我不理解这部分..它在做什么? public void run() { Connection.getInstance().connect(); }
标签: java multithreading