Java中在线程之间传递变量

Java中在线程之间传递变量,java,synchronization,Java,Synchronization,我在主类中创建了10个相同的线程(仅通过主键1到10区分)。在每个线程中,我需要读取前一个线程中的字段,即在线程5中,我需要读取线程4中的此字段。问题是我怎么做 public class Player extends Thread { private Integer playerNumber; public char lastDigit; public Player(Integer playerNumber) { super(); this.playerNumber = p

我在主类中创建了10个相同的线程(仅通过主键1到10区分)。在每个线程中,我需要读取前一个线程中的字段,即在线程5中,我需要读取线程4中的此字段。问题是我怎么做

public class Player extends Thread {

private Integer playerNumber;

public char lastDigit;

public Player(Integer playerNumber) {
    super();
    this.playerNumber = playerNumber;
}

public synchronized char getDigit(){
    return this.lastDigit;
}

public synchronized void setDigit(char digit){
    massage += digit;
    this.lastDigit = digit;
    try {
        Thread.sleep(1);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public void run(){

}
我需要读取最后一个数字字段

提前感谢:)

很多选项:)默认情况下,java集合不会同步:

您可以在静态变量/类中创建LinkedBlockingQueue:

您可以使用以下内容包装众多java集合中的一个:

  • Collections.synchronizedMap(..)
  • Collections.synchronizedList(..)
  • Collections.synchronizedSet(..)
如果您不介意一些复杂的问题,但担心GC开销,请使用Exchange(我建议您在这种情况下使用):

如果您真的想全力以赴,并且性能是一个主要问题,那么您可以使用Disrupter框架(不是为了假装):


几乎是我最喜欢的课程:)非常正确,我已经编辑过说Exchange可能是最适合他的应用程序的。对于交换器,交换方法将阻塞,直到线程之间发生“握手”。所以,只要他总是先尝试与前一个线程交换(想想哲学家吃饭的问题),这是一个很好的选择:)Hi exabrial。我试过换热器,它帮了我的忙。非常感谢:)不客气,这就是我们来这里的原因。确保选中复选标记以标记为已接受;);)wowow..谢谢..我也遇到过类似的问题,但不知道disruptor..我认为我必须使用外部数据库来共享线程之间的状态,这使得我的程序速度太慢,毫无用处。谢谢你的回答,我的节目正在起死回生。