我刚遇到有关Scanner(System.in)和Java中的线程的问题。
假设您有两个主题。在两者中,您等待使用扫描程序的用户输入从System.in输入流中读取。问题是不可能区分哪个字符串属于哪个线程(字符将在两个字符串之间传播看似随机)。我想这是因为两个线程共享相同的输入流。
有没有办法解决这个问题?
答案 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次相同的东西... 希望您能帮助我,对我的重大疑问深表歉意。