本帖最后由 炎星辰 于 2014-7-19 16:00 编辑
public static void main(String[] args) {
final SynchronousQueue<String> m = new SynchronousQueue<String>();
//特别注意SynchronousQueue 一定要先取数据 m.take() 在存m.put(input);才能取到数据 不然就死锁了!!!
//创建一个缓存线程池 线程池中的线程数根据任务多少自动增删 动态变化
ExecutorService threadPool = Executors.newCachedThreadPool();
final Semaphore sem = new Semaphore(1);//信号灯
for (int i = 0; i < 10; i++) {
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
sem.acquire();
String input = m.take();
String output = TestDo.doSome(input);
System.out.println(Thread.currentThread().getName()
+ ":" + output);
// custom.unlock();
sem.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}//这段代码如果放在绿色的下面 会出现死锁
System.out.println("begin:" + (System.currentTimeMillis() / 1000));
for (int i = 0; i < 10; i++) { // 这行不能改动
String input = i + ""; // 这行不能改动
try {
m.put(input);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 不能改动此TestDo类
class TestDo {
public static String doSome(String input) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String output = input + ":" + (System.currentTimeMillis() / 1000);
return output;
}
}
|
|