多线程中的多个扫描仪

时间:2017-04-17 22:39:46

标签: java multithreading inputstream

我刚遇到有关Scanner(System.in)和Java中的线程的问题。

假设您有两个主题。在两者中,您等待使用扫描程序的用户输入从System.in输入流中读取。问题是不可能区分哪个字符串属于哪个线程(字符将在两个字符串之间传播看似随机)。我想这是因为两个线程共享相同的输入流。

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:0)

同步块将解决此扫描程序的问题。

public class Threader implements Runnable {

    private String name;
    private Scanner input;

    public Threader(String name,Scanner input) {
        this.name = name;
        this.input = input;
    }

    @Override
    public void run() {
        synchronized (input) {
            System.out.print(name + " : " + input.nextLine());
        }
    }

}

在每个新线程中传递scanner对象。

Synchronized表示具有synchronized块的对象不允许两个线程同时访问块内的代码。现在我们在块中有关键代码,这意味着多个线程无法同时访问扫描器对象(输入)

答案 1 :(得分:0)

我的run()方法是一个开关,该开关调用其自身类的另一个方法。我在Sockets中使用BufferedReader。我试图同步所有内容,但是我做不到!还有其他方法吗?我在这里让你在我的代码的一部分:

注意:您认为“ DIS,DOS,BF”一无所有,但我想这个问题就解决了!

我正在尝试在此处同步BufferedReader和DataOutputStream

private void escribir(Socket clientsocket,BufferedReader br) {
    try {
        dos = new DataOutputStream(clientsocket.getOutputStream());
        dos.writeUTF(String.valueOf(identificador));
    }catch(Exception e) {
        e.printStackTrace();
        System.out.println("Error creando as canles");
    }
    synchronized(br) {
        synchronized(dos) {
    try {   
        while(clientsocket.isConnected()) {
            String datosenviar=br.readLine();
            dos.writeUTF(datosenviar);
        }
    }catch(Exception e) {
        System.out.println("Bot desconected");
    }
}}
}

我一直认为问题可能出在客户的输入上,所以我做了同样的事情:

private void leer(Socket clientsocket){
    try {
        dis = new DataInputStream(clientsocket.getInputStream());
    }catch(Exception  e) {
        e.printStackTrace();
        System.out.println("Chanel not created");
    }
    synchronized(dis) {
    try {
        while (clientsocket.isConnected()) {
            String datosentrada = dis.readUTF();
            if(datosentrada.contains("1234Broadcast:"))System.out.println("Bot Master says:"+datosentrada.substring(14));
            else if(datosentrada.contains("1234Bot"+identificador+":"))System.out.println("Bot Master says:"+datosentrada.substring(8+identificador.length()));
        }
    }catch(Exception e) {
        e.printStackTrace();
        System.out.println("Something Wrong happens here");
    }
}}

无论如何,当我有2个客户时,我需要写2次相同的东西... 希望您能帮助我,对我的重大疑问深表歉意。