как прекратить поток sendMsgToServer, когда выход отправляется со стороны сервера - PullRequest
0 голосов
/ 27 января 2012
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.concurrent.atomic.AtomicBoolean;

public class ThreadSandbox {
     //static volatile boolean runLoopX = true;
    static AtomicBoolean runLoopX = new AtomicBoolean();
    public static void main(String[] args) {

        final Thread thread1 = new Thread(new Runnable(){
            @Override
            public void run()
            {                
                try {
                    BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
                    String userInputStr = "";                                    
                    do {
                            System.out.println("Enter text for thread 1:");
                            userInputStr = userInput.readLine().trim();
                            System.out.println("User Input for thread 1: " + userInputStr);                            
                    } while (userInputStr.equals("e") == false && runLoopX.get()== false);        
                } catch (Exception e) {System.err.println(e.toString());}
                runLoopX.set(true);                
            }
        });
        final Thread thread2 = new Thread(new Runnable(){
            @Override
            public void run()
            {
                try {
                    BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
                    String userInputStr = "";                                    
                    do {    
                            System.out.println("Enter text for thread 2:");
                            userInputStr = userInput.readLine().trim();
                            System.out.println("User Input for thread 2: " + userInputStr);
                    } while (userInputStr.equals("e") == false && runLoopX.get()== false);        
                } catch (Exception e) {System.err.println(e.toString());}
                runLoopX.set(true);                
            }
        });
        Thread thread3 = new Thread(new Runnable(){
            @Override
            public void run()
            {
                do {
                    if (runLoopX.get() == true) {
                        thread1.interrupt();
                        thread2.interrupt();
                    }
                } while (runLoopX.get() == false);
            }
        });

        thread1.start();
        thread2.start();
        thread3.start();
        try {
            thread1.join();
            thread2.join();
            thread3.join();
        } catch (Exception e) {System.err.println(e.toString());}
    }
}

Issue: Если я введу «e» для ввода thread1, то thread1 завершится, но thread2 все еще работает, а если я введу «e» для ввода thread2, то thread2 завершится, но thread1 все еще будет работать.

Как мне прекратить оба потока, когда "e" введен в любом из потоков?

1 Ответ

0 голосов
/ 27 января 2012

вы должны синхронизировать ваши потоки для входов.

но синхронизированная строка и все ваши потоки проверяют эту строку перед тем, как что-либо читать

так что если эта строка имеет значение "e", то поток завершит ее сам. если не просто прочитать ввод, но значение в строке и продолжить.

убедитесь, что эта строка синхронизирована, и я хотел бы сделать ее энергозависимой


более конкретно, это плохой пример потоков! если один поток заблокирует приложение, пока пользователь не введет некоторые данные. другой поток должен ждать в очереди ожидания для большей производительности. в этом случае все ваши потоки будут храниться в очереди готовности, и это будет использовать загрузку ЦП.

, чтобы решить эту проблему, попробуйте использовать Блокировку и Условия.


это быстрый код для решения проблемы с сокетами:

public class ThreadSandbox {
public static  syncrnized boolean continueWork = true;

public static void main(String[] args) {

    final Thread thread1 = new Thread(new Runnable(){
        @Override
        public void run()
        {   while(continueWork){
                try {

                    socket.setSoTimeout(5 *1000);
                    //READ str FROM SOCKET 
                    if(str.equals("e")) {
                        continueWork =false;
                    }
                } catch (TimeoutException e) {
                    System.err.println(e.toString());
                } catch (Exception e) {
                    System.err.println(e.toString());
                }
            }           
        }
    });

    final Thread thread2 = new Thread(new Runnable(){
        @Override
        public void run()
        {   while(continueWork){
                try {

                    socket.setSoTimeout(5 *1000);
                    //READ str FROM SOCKET 
                    if(str.equals("e")) {
                        continueWork =false;
                    }
                } catch (TimeoutException e) {
                    System.err.println(e.toString());
                } catch (Exception e) {
                    System.err.println(e.toString());
                }
            }           
        }
    });

    thread1.start();
    thread2.start();
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...