2014-11-19 4 views
2

현재 완료된 문자열은 System.out.println()을 사용하여 여러 개의 실행 가능 클래스가 있습니다.스레드에서 출력 스트림을 얻는 방법

main()에서는 ExecutorService 인 executor.execute()을 사용하여 실행합니다. 나는 그 스레드를 실행 한 후 궁금

, how to get the output stream from them for future use ?

꽤 많은 프로세스 .getInputStream를 사용하지만, Thread 클래스에서 그런 방법은 없다있다. 감사!

public class A implements Runnable { 
    public void run() { 
     System.out.println(5);   //this thread always print out number 5 
    } 
} 

과 주요 기능에 내가 인쇄 된 번호를하고 저장해야

public static void main(String[] args) { 

    ExecutorService ThreadPool = Executors.newFixedThreadPool(1); 
    ThreadPool.execute(new A());  //This statement will cause the thread object A 
            //to print out number 5 on the screen 
    ThreadPool.shutdown(); 
    ...... 
} 

지금은 인쇄하는 데 필요한 :

이 같은 실행 가능한 인터페이스를 구현하는 클래스가있다 숫자 5를 만들고이를 정수 변수에 저장하십시오.

+0

는 부모 프로세스의 과정과 동일 출력 스트림에 기입 스레드하지 않습니다,이 이후 자연적인 것 그들은 메모리를 공유하며, 자연스럽게 기본 파일 기술자를 공유합니다. – luk32

+0

나는 꽤 이해하지 못합니까? 각 스레드는 System.out.println()을 사용하여 출력합니다. – Austin

+0

출력 스트림이 공유 리소스가 아니므로 한 번에 하나의 스레드에서 액세스해야합니다. 틀렸을 수 있습니다. – ha9u63ar

답변

0

새로운 정적 클래스를 사용할 수는 :

public class Global{ 

//example 
public static .. 
public static .. 
} 
2

나는 당신의 요구 사항을 만족하는 코드 아래 생각합니다. 스레드에서의 Runnable 및 호출 가능

class MyCallable implements Callable<InputStream> 
{ 
    @Override 
    public InputStream call() throws Exception { 
     //InputStream inputStreamObject = create object for InputStream 
     return inputStreamObject; 
    } 
} 
class Main 
{ 
    public static void main(String[] args) { 
     ExecutorService executor = Executors.newFixedThreadPool(5); 
     List<Future<InputStream>> list = new ArrayList<Future<InputStream>>(); 
     for (int i = 0; i < 25; i++) { 
      Callable<InputStream> worker = new MyCallable(); 
      Future<InputStream> submit = executor.submit(worker); 
      list.add(submit); 
     } 
     InputStream inputStreamObject = null; 
     for (Future<InputStream> future : list) { 
      try { 
       inputStreamObject = future.get(); 
       //use inputStreamObject as your needs 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } catch (ExecutionException e) { 
       e.printStackTrace(); 
      } 
     } 
     executor.shutdown(); 
    } 
} 
+0

Thx 귀하의 회신을 위해. 하지만 전화() 메서드는 스레드에서 inputstream 개체를 생성 할 수 있습니다 궁금하네요? – Austin

+0

inputstream 객체를 가져 와서 얻으려고하는 것은 무엇입니까? 질문에서 당신은 그것을 적절하게 언급하지 않았습니다.귀하의 전체 요구 사항을 업데이 트하십시오 .. 아직 귀하의 질문 막연한입니다 .. 귀하의 질문에 따라 그냥 inputstream의 개체를 반환합니다. –

+0

설명을 업데이트했습니다. 나는 당신이 볼 수있는 경우 크게 그것을 감사하겠습니다 :) – Austin

0

:

runnable 인터페이스는 방법 public abstract void run(); 무효가 - 실행 방법을 완료 한 후 의미, 그것은 아무것도 반환하지 않습니다. Callable<V> 인터페이스 호출 방법을 완료 한 후 의미하는 방법을 V call() throws Exception; 가지고, 그것은

으로 매개 변수화되는 객체 V를 반환합니다
public class Run_Vs_Call { 
    public static void main(String...args){ 
     CallableTask call = new CallableTask(); 
     RunnableTask run = new RunnableTask(); 
     try{ 
      FutureTask<String> callTask = new FutureTask<String>(call); 
      Thread runTask = new Thread(run); 
      callTask.run(); 
      runTask.start(); 
      System.out.println(callTask.get()); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    public static class CallableTask implements Callable<String>{ 
     public String call(){ 
      String stringObject = "Inside call method..!! I am returning this string"; 
      System.out.println(stringObject); 
      return stringObject; 
     } 
    } 
    public static class RunnableTask implements Runnable{ 
     public void run(){ 
      String stringObject = "Inside Run Method, I can not return any thing"; 
      System.out.println(stringObject); 
     } 
    } 
} 
관련 문제