2012-01-26 32 views
0
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());} 
    } 
} 

问题: 如果我输入“E”的线程1输入,则线程1终止,但是线程2仍然在运行,如果我输入“E”为线程2输入,则thread2终止,但thread1仍在运行。如何终止线程sendMsgToServer时退出从服务器端发送

如何在两个线程中输入“e”时终止两个线程?

回答

0

你应该同步你的线程的输入。

但同步串并完成所有的线程试图读取任何

因此,如果这个字符串的值是“E”之前检查此字符串,然后该线程将终止它的自我。如果不是只读取输入,而是读取字符串中的值并继续。

确保这个字符串进行同步,我想,使其挥发


更具体,这是线程的坏榜样!如果一个线程会锁定应用程序直到用户输入一些数据。另一个线程应该在等待队列中等待更多的性能。 在这种情况下,所有线程都将保留在就绪队列中,这会消耗CPU利用率。

解决此问题尝试使用锁定和条件。


这是一个快速pesedo代码来解决插座问题:

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(); 
} 
} 
+0

我实际上做这行,我想用一个套接字侦听传入的消息,另一个插座发送消息。所以当客户端或服务器输入e时,应用程序需要结束。 – shresthaal 2012-01-27 00:17:01

+0

好吧,你所有的线程应该循环一个静态同步变量,比如'while(continueWork){}',并且这个变量所有的线程都可以设置并获取所有线程。 也需要设置超时为您的套接字。 我将编辑套接字的答案。 – daigoor 2012-01-30 14:55:14