java—从全局变量读写

vsaztqbk  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(551)

我要做的是有一个全局变量类和函数可以从/到读/写。
我现在拥有的是

import java.lang.*;             
import lab1.Global;
public class SecondProgram {
     public static void main ( String args[] ) {
            System.out.println("hi ");
            Global.b[0] = " zero ";
            Global.b[1] = " One ";
            Global.b[2] = " Two ";
            Global.b[3] = " Three ";

        }
}

我创建了一个类来存储全局变量

public class Global {
  public static String a = "hi" ;
  public static String [] b;
}

当然,重要的是数组的大小不是一个硬编码的常量,而是一个变量,我可以在某个时候找到它并插入。
我希望你能从代码中看到我在做什么,你知道如何让它工作。
谢谢!

bwntbbo3

bwntbbo31#

我认为这是一个更好的方法,可以让你开始。。。。

import java.util.ArrayList;

public class SecondProgram {

    private static ArrayList <String>file = new ArrayList();

    public synchronized boolean  writeFile(String str){
        //wrtite file to your list
        file.add(str);
        return true;
    }
    public static void main(String args[]) {
        //read file and use the synchronized method to write it to your list
    } 
}
eoigrqb6

eoigrqb62#

我需要全局变量,因为我让线程将文本文件中的数据读取到数组中,在线程完成工作后,数组及其数据保持在当前状态非常重要。
那不行。或者至少,它不会可靠地工作(从某种意义上说,这是一个更糟糕的结果!)
在多线程java程序中,您需要确保线程在信息从一个线程传递到另一个线程时正确同步。同步的目的有两个:
防止种族歧视;i、 e.一个线程在另一个线程读取某个值之前尝试读取该值,并且
以确保线程不会由于内存缓存效应而看到值的过时副本。
同步光秃秃的全局变量将是非常困难的。我的建议是
注意上面的注解,并使用类来封装状态。
使用中的实用程序类 java.util.concurrent 要实现共享数据结构。。。并处理线程创建/管理。以executorservice api为例,
找一本关于java并发编程的好教材。java中的并发并不简单,如果您不知道自己在做什么,您可以花费数小时/数天/数周/数月的时间来跟踪间歇性故障的原因。

flvtvl50

flvtvl503#

我不提倡使用globals,但是如果必须的话,可以做如下的事情。一般来说:让每个线程建立自己的数据。完成工作后,将其数据添加到同步的全局集合(在本例中为 List<List<String>> ). 然后在所有线程完成工作后阅读该集合。
收集数据的全局数据库:

public class GlobalDataBroker {
    public static List<List<String>> data = Collections.synchronizedList(new LinkedList<List<String>>());
}

示例实现:

public static void main(String[] args) throws InterruptedException {
    for (int i=0; i < 10; i++) {
        new Thread(new Runnable(){
            @Override
            public void run() {
                List<String> list = new LinkedList<String>();
                list.add(String.format("I'm a Thread and my name is %s.",Thread.currentThread()));
                for (int i = 0; i < 5; i++) {
                    list.add("Data!");
                }
                GlobalDataBroker.data.add(list);
            }
        }).start();
    }

    // When the threads are done ...            
    Iterator<List<String>> i = GlobalDataBroker.data.iterator();
    while (i.hasNext()) {
        System.out.println(i.next());
    }
}

输出:

[I'm a Thread and my name is Thread[Thread-8,5,main]., Data!, Data!, Data!, Data!, Data!]
[I'm a Thread and my name is Thread[Thread-5,5,main]., Data!, Data!, Data!, Data!, Data!]
...
[I'm a Thread and my name is Thread[Thread-7,5,main]., Data!, Data!, Data!, Data!, Data!]

请注意,只有在完成数据的编写之后,才应该开始对其进行迭代(否则,你可能会遇到恐惧 ConcurrentModificationException .)

相关问题