mulithread server with futureTask

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • oll3i
    Contributor
    • Mar 2007
    • 679

    mulithread server with futureTask

    Code:
    class SocketServer extends JFrame{
    
    	   JLabel label = new JLabel("Text received over socket:");
    	   JPanel panel;
    	   JTextArea progress = new JTextArea();
    	   ServerSocket server = null;
    	 
    	   Callable<String> reverseTask = new Callable<String>;
    	    
    		  
    		  public void listenSocket(){
    		    try{
    		      server = new ServerSocket(4444); 
    		    } catch (IOException e) {
    		      System.out.println("Could not listen on port 4444");
    		      System.exit(-1);
    		    }
    		    while(true){
    		      
    		    	ClientWorker w;
    			      try{
    			    	  w = new ClientWorker(server.accept(), progress);
    				        Thread t = new Thread(w);
    				        t.start();
    			    	 
    		      } catch (IOException e) {
    		        System.out.println("Accept failed: 4444");
    		        System.exit(-1);
    		      }
    		    }
    		  }
    	    
    	   
    	  		   
          
    	   
    	   
    	   
    	   
    	   SocketServer(){ //Begin Constructor
    		   Font f = new Font("Dialog", Font.PLAIN, 16);
    		   
    		    progress.setFont(f);
    		    JPanel p = new JPanel();
    		    JButton b = new JButton("Start");
    		    b.addActionListener(new ActionListener() {
    		      public void actionPerformed(ActionEvent e) {
    		        ft = new FutureTaskCallback<String>(reverseTask);
    		        toReverse = progress.getText();
    		        exec.execute(ft);
    		      }
    		    });
    		    p.add(b);
    		    b = new JButton("Stop");
    		    b.addActionListener(new ActionListener() {
    		      public void actionPerformed(ActionEvent e) {
    		        if (ft != null) ft.cancel(true);
    		      }
    		    });
    		    p.add(b);
    		    Container cp = getContentPane();
    		    cp.setLayout(new BoxLayout(cp, BoxLayout.Y_AXIS));
    		   
    		    add(p);
    		    add(progress);
    		    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		    pack();
    		    setVisible(true);
    	   } //End Constructor
    
    	   
    	   
    
    		  ExecutorService exec = Executors.newSingleThreadExecutor();
    			  FutureTaskCallback<String> ft;   	   
    	   
    			  
    			  String toReverse;
    	
    
    						  
    			  
    
     
    	  
    
    	   		  
    	   		  
    	   		  
    	   		  
    	  protected void finalize(){
    //	Objects created in run method are finalized when 
    //	program terminates and thread exits
    	     try{
    	        server.close();
    	    } catch (IOException e) {
    	        System.out.println("Could not close socket");
    	        System.exit(-1);
    	    }
    	  }
    
    	  public static void main(String[] args){
    		  SocketServer frame = new SocketServer();
    		frame.setTitle("Server Program");
    	        WindowListener l = new WindowAdapter() {
    	                public void windowClosing(WindowEvent e) {
    	                        System.exit(0);
    	                }
    	        };
    	        frame.addWindowListener(l);
    	        frame.pack();
    	        frame.setVisible(true);
    	        frame.listenSocket();
    	  }
    	}
    why eclipse higlights this >>>. Callable<String > reverseTask = new Callable<String >;as an error

    please help
  • JosAH
    Recognized Expert MVP
    • Mar 2007
    • 11453

    #2
    Originally posted by oll3i
    why eclipse higlights this >>>. Callable<String > reverseTask = new Callable<String >;as an error

    please help

    Because Callable is an interface, you can't instantiate it. I'm sure Eclipse tells
    quite a bit more than just flagging it as an error; it also gives you the reason
    why it is an error (which most of the time is the way to a solution).

    kind regards,

    Jos

    Comment

    • oll3i
      Contributor
      • Mar 2007
      • 679

      #3
      Code:
       while(true){
      	      ClientWorker w;
      	      FutureTask task = new FutureTask (new MyCallable ());
          	  ExecutorService es = Executors.newSingleThreadExecutor ();
          	  es.submit (task);
      	      try{
      	    	  
      	    	  int result = task.get();
      	    	  System.out.println ("Result from task.get () = " + result);
      
        
      	        w = new ClientWorker(server.accept(),  output);
      	        Thread t = new Thread(w);
      	        t.start();
      	      } catch (IOException e) {
      	        System.out.println("Accept failed: 4444");
      	        System.exit(-1);
      	      }
      	      es.shutdown (); 
      	    }
      	  }
      now eclipse says cannot convert form object to int
      here>>> int result = task.get();

      Comment

      • JosAH
        Recognized Expert MVP
        • Mar 2007
        • 11453

        #4
        Originally posted by oll3i
        now eclipse says cannot convert form object to int
        here>>> int result = task.get();
        That's because FutureTask is a generic class, i.e. you have to specify the type
        of what shall be returned by the FutureTask. You didn't specify anything so the
        return type is Object. An Object can not be cast to an int as Eclipse correctly
        noticed.

        kind regards,

        Jos

        Comment

        • oll3i
          Contributor
          • Mar 2007
          • 679

          #5
          Code:
          public class MyCallable implements Callable
          {String toReverse;
          JTextArea output = new JTextArea();
          ServerSocket server = null;
            public String call () throws java.io.IOException, InterruptedException {
          
          	  ClientWorker w = new ClientWorker(server.accept(),  output);
              Thread t = new Thread(w);
               t.start();
          	  ////Thread t = Thread.currentThread();
                if (toReverse == null || toReverse.trim().equals(""))
                  throw new IllegalArgumentException("Set string to reverse");
                if (t.isInterrupted()) return null;
                char[] org = toReverse.toCharArray();
                StringBuffer out = new StringBuffer();
                if (t.isInterrupted()) return null;
                for (int i = org.length-1; i>=0; i--) {
                  Thread.sleep(500);
                  out.append(org[i]);
                  if (t.isInterrupted()) return null;
                  output.setText(out.toString());
                  if (t.isInterrupted()) return null;
                }
                return out.toString();
              }
          now i get java.lang.OutOf MemoryError: unable to create new native thread when i try to run a client i think it's in MyCallable

          Comment

          • oll3i
            Contributor
            • Mar 2007
            • 679

            #6
            help me please

            Comment

            • oll3i
              Contributor
              • Mar 2007
              • 679

              #7
              [code]
              public void listenSocket(){

              server = mycallable.getS erver();
              mycallable.setT oReverse(textFi eld.getText());
              while(true){
              ///ClientWorker w;

              FutureTaskCallb ack task = new FutureTaskCallb ack (mycallable);
              ExecutorService es = Executors.newSi ngleThreadExecu tor ();
              es.submit (task);

              es.shutdown ();
              }
              }[code]

              this code causes Outofmemory error

              Comment

              Working...