有这么个题目:
一个线程不停地生产玩家,一个线程不停地生产怪物,然后都放在一个容器里面去。当容器中的玩家和怪物总数超过10万的时候,全部停止。
只有一个要求:打印true。
哥们调试了大半天了,每个头绪,气死我了,各位帮着改改。
建一个类 叫:GoToHell 直接把代码copy进去调试吧。public class GoToHell {
private static abstract class BaseClass {
public BaseClass() { }
} public static class Player extends BaseClass { } public static class Monster extends BaseClass { } private static boolean con = true;
//新的集合
private static Collection<BaseClass> newList = Collections
.synchronizedCollection(new ArrayList<BaseClass>());
//总的集合
private static Collection<BaseClass> allList = new ArrayList<BaseClass>(); //玩家总数
private static int playerNum;
//怪物总数
private static int monsterNum; public static void main(String[] args) {
new Thread() {
public void run() {
while (con) {
newList.add(new Player());
playerNum++;
} }
}.start(); new Thread() {
public void run() {
while (con) {
newList.add(new Monster());
monsterNum++;
}
}
}.start(); new Thread() {
public void run() {
while (con) {
if(!newList.isEmpty()){
allList.addAll(newList);
newList.clear();
}
if(allList.size() > 100000){
con = false;
}
}
//要求这里 打印:true
System.out.println(playerNum + monsterNum == allList.size());
System.out.println(playerNum);
System.out.println(monsterNum);
System.out.println(allList.size());
}
}.start();
}}
一个线程不停地生产玩家,一个线程不停地生产怪物,然后都放在一个容器里面去。当容器中的玩家和怪物总数超过10万的时候,全部停止。
只有一个要求:打印true。
哥们调试了大半天了,每个头绪,气死我了,各位帮着改改。
建一个类 叫:GoToHell 直接把代码copy进去调试吧。public class GoToHell {
private static abstract class BaseClass {
public BaseClass() { }
} public static class Player extends BaseClass { } public static class Monster extends BaseClass { } private static boolean con = true;
//新的集合
private static Collection<BaseClass> newList = Collections
.synchronizedCollection(new ArrayList<BaseClass>());
//总的集合
private static Collection<BaseClass> allList = new ArrayList<BaseClass>(); //玩家总数
private static int playerNum;
//怪物总数
private static int monsterNum; public static void main(String[] args) {
new Thread() {
public void run() {
while (con) {
newList.add(new Player());
playerNum++;
} }
}.start(); new Thread() {
public void run() {
while (con) {
newList.add(new Monster());
monsterNum++;
}
}
}.start(); new Thread() {
public void run() {
while (con) {
if(!newList.isEmpty()){
allList.addAll(newList);
newList.clear();
}
if(allList.size() > 100000){
con = false;
}
}
//要求这里 打印:true
System.out.println(playerNum + monsterNum == allList.size());
System.out.println(playerNum);
System.out.println(monsterNum);
System.out.println(allList.size());
}
}.start();
}}
public class GoToHell { private static Collection<BaseClass> allList = new ArrayList<BaseClass>();
private static abstract class BaseClass {
public BaseClass() {}
} public static class Player extends BaseClass {} public static class Monster extends BaseClass {}
public static void main(String[] args) {
new Thread() {
public void run() {
while (true) {
add(new Player());
}
}
}.start(); new Thread() {
public void run() {
while (true) {
add(new Monster());
}
}
}.start();
} private static synchronized void add(BaseClass base){
if(allList.size()<1000){
allList.add(base);
}else{
System.out.println("true");
}
}
}
import java.util.Collection;
import java.util.Collections;public class GoToHell {
private static abstract class BaseClass {
public BaseClass() { }
} public static class Player extends BaseClass { } public static class Monster extends BaseClass { } private static boolean con = true;
//新的集合
private static Collection<BaseClass> newList = Collections
.synchronizedCollection(new ArrayList<BaseClass>());
//总的集合
private static Collection<BaseClass> allList = new ArrayList<BaseClass>(); //玩家总数
private static int playerNum;
//怪物总数
private static int monsterNum; public static void main(String[] args) {
new Thread() {
public void run() {
while (con) {
newList.add(new Player());
playerNum++;
} }
}.start(); new Thread() {
public void run() {
while (con) {
newList.add(new Monster());
monsterNum++;
}
}
}.start(); new Thread() {
public void run() {
while (con) {
if (newList.size()>100000) {
con = false;
}
/*if(!newList.isEmpty()){
allList.addAll(newList);
newList.clear();
}
if(allList.size() > 100000){
con = false;
}*/
}
//要求这里 打印:true
System.out.println(playerNum + monsterNum == newList.size());
System.out.println(playerNum);
System.out.println(monsterNum);
System.out.println(newList.size());
}
}.start();
}}
private static synchronized void add(BaseClass base){
改成
private static synchronized boolean add(BaseClass base){
传给while停止循环,就可以了
5喽的兄弟说的可以考虑一下
import java.util.Collection;/**
* 有这么个题目: 一个线程不停地生产玩家,一个线程不停地生产怪物,然后都放在一个容器里面去。<br/>
* 当容器中的玩家和怪物总数超过10万的时候,全部停止。<p/> 只有一个要求:打印true。
*
* @author HouLei
*
*/
public class GoToHell {
private static abstract class BaseClass {
} public static class Player extends BaseClass {
} public static class Monster extends BaseClass {
} // 总的集合
private Collection<BaseClass> allLives = new ArrayList<BaseClass>(100100); // 玩家总数
private int playerNum; // 怪物总数
private int monsterNum; public synchronized void add(BaseClass life) {
if (life instanceof Player) {
playerNum++;
}
if (life instanceof Monster) {
monsterNum++;
}
allLives.add(life);
} public synchronized int getMonsterNum() {
return monsterNum;
} public synchronized int getPlayerNum() {
return playerNum;
} public synchronized int getLivesCount() {
return allLives.size();
} /**
* 可以统一结束的线程抽象类。
* 通过使用内部的<code>running</code>变量,实现所有实现类线程的结束。
*/
abstract static class UnityThread extends Thread {
protected static boolean running = true; protected void shutdownAll() {
running = false;
}
} public static void main(String[] args) {
final GoToHell Hell = new GoToHell();
final int MaxLives = 100000; new UnityThread() {
public void run() {
while (running) {
Hell.add(new Player());
Thread.yield();
}
}
}.start(); new UnityThread() {
public void run() {
while (running) {
Hell.add(new Monster());
Thread.yield();
}
}
}.start(); new UnityThread() {
public void run() {
while (running) {
if (Hell.getLivesCount() > MaxLives) {
shutdownAll();
} else {
Thread.yield();
}
}
// 要求这里 打印:true
System.out.println(Hell.getPlayerNum() + Hell.getMonsterNum() == Hell.getLivesCount());
System.out.println(Hell.getPlayerNum());
System.out.println(Hell.getMonsterNum());
System.out.println(Hell.getLivesCount());
}
}.start(); }}
如果可能20W,200W,... ... 也属于超过10W的范畴。嗯~~~
是不是很猥琐 ?
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;public class GoToHell {
private static abstract class BaseClass {
public BaseClass() { }
} public static class Player extends BaseClass { } public static class Monster extends BaseClass { } private static boolean con = true;
//新的集合
private static Collection<BaseClass> newList = Collections
.synchronizedCollection(new ArrayList<BaseClass>());
private static BlockingDeque bq = new LinkedBlockingDeque(100000);
//总的集合
private static Collection<BaseClass> allList = new ArrayList<BaseClass>(); //玩家总数
private static int playerNum;
//怪物总数
private static int monsterNum; public static void main(String[] args) throws Exception {
Thread t1 = new Thread() {
public void run() {
while (con) {
try{
bq.add(new Player());
playerNum++;
}catch(java.lang.IllegalStateException e){
con = false;
}
} }
};
t1.start(); Thread t2 = new Thread() {
public void run() {
while (con) {
try{
bq.add(new Monster());
monsterNum++;
}catch(java.lang.IllegalStateException e){
con = false;
}
}
}
};
t2.start(); t1.join();
t2.join();
//要求这里 打印:true
System.out.println(playerNum + monsterNum == allList.size());
System.out.println(playerNum);
System.out.println(monsterNum);
System.out.println(bq.size());
}}
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;public class GoToHell {
private static abstract class BaseClass {
public BaseClass() { }
} public static class Player extends BaseClass { } public static class Monster extends BaseClass { } private static boolean con = true;
//新的集合
private static Collection<BaseClass> newList = Collections
.synchronizedCollection(new ArrayList<BaseClass>());
private static BlockingDeque bq = new LinkedBlockingDeque(100000);
//总的集合
private static Collection<BaseClass> allList = new ArrayList<BaseClass>(); //玩家总数
private static int playerNum;
//怪物总数
private static int monsterNum; public static void main(String[] args) throws Exception {
Thread t1 = new Thread() {
public void run() {
while (con) {
try{
bq.add(new Player());
playerNum++;
}catch(java.lang.IllegalStateException e){
con = false;
}
} }
};
t1.start(); Thread t2 = new Thread() {
public void run() {
while (con) {
try{
bq.add(new Monster());
monsterNum++;
}catch(java.lang.IllegalStateException e){
con = false;
}
}
}
};
t2.start(); t1.join();
t2.join();
//要求这里 打印:true
System.out.println(playerNum + monsterNum == allList.size());
System.out.println(playerNum);
System.out.println(monsterNum);
System.out.println(bq.size());
}}