Java多线程与共享列表

时间:2015-10-23 11:33:35

标签: java multithreading

我需要一些java多线程的帮助。我有这门课:

public class EdgeServer{

    private static final int ServidorBordaID = 9;
    private static final String urlLogin = "http://localhost/exehdager-teste/index.php/ci_login/logar";
    private static final String insertSensorURI = "http://localhost/exehdager-teste/index.php/cadastros/ci_sensor/gravaSensor";
    private static final String insertGatewayURI = "http://localhost/exehdager-teste/index.php/cadastros/ci_gateway/gravaGateway";
    private static ArrayList<Gateway> gatewaysCadastrados = new ArrayList<>();

    public static void main(String[] args) {
        // Start a user thread that runs the UPnP stack
        Thread clientThread = new Thread(new Descoberta());
        clientThread.setDaemon(false);
        clientThread.start();

        Thread publicationThread = new Thread(new Publication());
        publicationThread.setDaemon(false);
        publicationThread.start();
    }
}

主题Descoberta将根据需要向gatewaysCadastrados列表添加新的itens。并且Publication线程将读取此列表并对列表中的每个对象执行操作。

我只需要知道如何共享并将此var传递给线程。我需要建立一个信号量才能做到这一点吗?

2 个答案:

答案 0 :(得分:1)

以下是您可以在两个线程之间共享列表的示例代码,您需要使用wait和notify来获取信号量。

public class Descoberta extends Thread {
private  final ArrayList<Gateway> a = new ArrayList<>();
public Descoberta( ArrayList<Gateway> a) {
        this.a = a;
    }

    @Override
    public void run() {
         synchronized (a) {
                while(true){ // your condition
                    a.wait();
                }
                a.notify();
         }
    }
}

public class Publication extends Thread {
private  final ArrayList<Gateway> b = new ArrayList<>();
public Publication(ArrayList<Gateway> b) {
        this.b = b;
    }

    @Override
    public void run() {
         synchronized (b) {
                while(true){ // your condition
                    b.wait();
                }
                b.notify();
         }
    }
}

public class EdgeServer {
    public static void main(String args[]) {
        private final ArrayList<Gateway> gatewaysCadastrados = new ArrayList<>();
        Thread clientThread = new Descoberta(gatewaysCadastrados);
        Thread publicationThread = new Publication(gatewaysCadastrados);
        clientThread.start();
        publicationThread.start();
    }
}

答案 1 :(得分:0)

将共享对象作为构造函数参数传递给相关runnables的简单方法; e.g。

Thread clientThread = new Thread(new Descoberta(gateways));
...
Thread publicationThread = new Thread(new Publication(gateways));

显然,各个Runnable构造函数需要保存参数,以便他们的run()方法可以找到它们。

还有其他各种方式:

  • 如果runnables是同一外部类实例中的内部类,则它们可以访问外部类中的共享对象。

  • 如果共享状态存储在static个变量中,那么runnables可以通过静态getter等访问它们。 (注意:这很可能是糟糕的设计......)

正如@Fidor指出的那样,如果两个或多个线程要共享一个公共(可变)数据结构,那么他们需要在数据结构上同步它们的读写操作。如果你忽略了这一点,那么你的应用程序可能会出现难以重现并且难以追踪的那种潜在的错误。