2013-05-21 111 views
-4

我是新的线程,我需要修复这个错误,你能帮我吗?线程问题

对不起是我的错,这是我必须做的:

此Web应用程序必须执行1000个游戏和显示输出结果。

我再次道歉。

由于

/** 
* 
* Automatic agent to play 1000 games 
* 
*/ 
public class AutoPlayer implements Runnable { 

    private RequestDispatcher requestDispatcher; 

    public AutoPlayer(RequestDispatcher requestDispatcher) { 
    this.requestDispatcher = requestDispatcher; 
    } 


    public static void main(String[] args) { 

    HashMap<String, Game> games = new HashMap<String, Game>(); 

    RequestDispatcher rd = new RequestDispatcher(games); 

    Vector<Thread> threads = new Vector<Thread>(); 

    for (int i = 0; i < 10; i++) { 
     AutoPlayer autoPlayer = new AutoPlayer(rd); 
     Thread thread = new Thread(autoPlayer); 
     threads.add(thread); 
     thread.start(); 
    } 

    for (int i = 0; i < threads.size(); i++) { 
     try { 
     threads.get(i).join(); 
     } catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 
    } 

    } 



    @Override 
    public void run() { 

    PlayResponse response = null; 

    for (int i = 0; i < 1000; i++) { 
     byte[] numbers = requestDispatcher.cardRequest(); 

     try { 
     response = new PlayResponse(); 
     requestDispatcher.process("Lucky", 10, numbers, response); 
     } catch (UnknownGameException e) { 
     e.printStackTrace(); 
     } 

     if (response != null) { 
     System.out.println("[" + Thread.currentThread() + "] total requests:" + requestDispatcher.generatedCards); 
     } 
    } 
    } 

} 



public class Game { 

    private String name; 
    private int gamesPlayed; 

    public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
    this.name = name; 
    } 

    public int getGamesPlayed() { 
    return gamesPlayed; 
    } 

    public void setGamesPlayed(int gamesPlayed) { 
    this.gamesPlayed = gamesPlayed; 
    } 

} 



/** 
* 
* Response to a Play request 
* 
*/ 
public class PlayResponse { 

    private boolean error; 
    private long win; 

    public boolean isError() { 
     return error; 
    } 
    public void setError(boolean error) { 
     this.error = error; 
    } 
    public long getWin() { 
     return win; 
    } 
    public void setWin(long win) { 
     this.win = win; 
    } 

} 




/** 
* 
* Object that processes play requests, calculates outcomes and returns results. 
* 
*/ 
public class RequestDispatcher { 

    List<String> list = Arrays.asList("Lucky", "Happy", "Extra"); 

    final int CARD_SIZE = 15; 

    public String GAME_UNAVAILABLE = "Error: Game not available"; 

    Map<String, Game> games; 

    long generatedCards; 

    Logger logger = Logger.getLogger(getClass().getName()); 

    Random r = new Random(); 

    public RequestDispatcher(HashMap<String, Game> games) { 
    this.games = games; 

    } 

    public byte[] cardRequest() { 
    byte[] result = createCard(); 
    generatedCards++; 

    return result; 
    } 

    private byte[] createCard() { 

    byte[] result = new byte[CARD_SIZE]; 

    r.nextBytes(result); 

    return result; 
    } 

    public void process(String s, int i, byte[] bb, PlayResponse pr0) throws UnknownGameException { 

    if (!list.contains(s)) { 
     logger.log(Level.SEVERE, GAME_UNAVAILABLE); 
     throw new UnknownGameException(GAME_UNAVAILABLE); 
    } 

    Game game = games.get(s); 

    if (game != null) { 
     game.setGamesPlayed(game.getGamesPlayed() + 1); 
    } else { 
     Game g = new Game(); 
     g.setName(s); 
     games.put(s, g); 
     g.setGamesPlayed(0); 
    } 

    pr0.setWin(r.nextInt(3) * i); 
    pr0.setError(false); 

    } 
} 


public class UnknownGameException extends Exception { 

    private static final long serialVersionUID = 2380720995275983122L; 

    public UnknownGameException(String s) { 
    super(s); 
    } 
} 
+3

这是很多代码。你能提供一个最小的工作例子吗?请查看http://sscce.org – cyroxx

+1

请修剪/缩小代码的大小。方法setError,getName,getWin,setWin与你所遇到的问题有什么关系?如果代码太多,人们会忽略这个问题。 –

+0

例如。你的代码中的记录器对你所问的问题没有影响。去掉它。 –

回答

1

该代码在main创建10个线程。每个线程在run中播放1000场比赛。总共有10 * 1000 = 10000个游戏。

要更改游戏数量,只需更改这些数字即可。

1

如果您需要执行run 1000次使用10个线程,请考虑以下选项。

  1. 使每个线程执行100次。
  2. 使用线程间共享的静态计数器,在计数器达到1000时停止执行。请确保您使用计数器的AtomicInteger以确保它是线程安全的。
0

在代码中,您正在创建10个主线程。 只需更改共享字段和方法的线程数并使用同步。