2014-02-24 2 views
2

나는 질문이 있는데, 꽤 오랫동안 그것을 검색 한 후 그 답을 찾을 수 없었다. 브라우저 응용 프로그램을 만들려고합니다. 내가 원하는 것은 메인 메소드가 실행될 때 메인 브라우저 애플리케이션으로 간주하고 사용자는 이제 여러 개의 탭을 여는 옵션을 가졌다는 것입니다. 스레드가 시작될 때마다 탭이 열리고 주 응용 프로그램이 닫히면 모든 탭이 닫힙니다. 각 탭 (스레드)은 독립적으로 실행되며 사용자는 탭을 전환 할 수있는 옵션을 가지고 있습니다. 사용자가 새 탭에서 작업하면서 사용자가 원하는만큼 탭을 열 수 있습니다. 그 작업을 완료하고 오히려 다음은 주요로 돌아갑니다 사용자로부터 입력을 기다리고,스레드간에 제어를 전송하는 방법

import java.util.Scanner; 

public class mainClass 
{ 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) 
    { 
     Scanner in = new Scanner(System.in); 

     String input="abc"; 
     String check="true"; 

     while (check=="true") 
     { 
      System.out.println("if you want to open new tab write yes"); 
      input=in.nextLine(); 
      if (input.equals("yes")) 
      { 
       System.out.println("if check"); 
       Thread tab = new myThread(); 
       tab.start(); 
       check="true"; 
      } 
      else 
      { 
       check="false"; 
       System.out.println("else check"); 
      } 
     } 
     return; 
    } 
} 

public class myThread extends Thread 
{ 
    public myThread() 
    { 
     setDaemon(true);                           
    } 

    public void run() 
    { 
      Scanner in = new Scanner(System.in); 

     System.out.println("one thread started"); 

      System.out.println("enter url to search\n"); 

      String input=in.nextLine(); 

    } 
} 

내 문제는 사용자가 스레드를 열고 싶을 때,이 열릴 것입니다 : 여기 내 코드입니다. 내가 원하는 것은 사용자가 탭 사이를 전환 할 수있는 옵션이 있어야한다는 것입니다. 사용자가 탭을 열면 그는 아무 것도하지 않고도 다른 탭으로 전환하기를 원할 때도 해당 탭에 머무르게됩니다. 어떻게 스레드를 완전히 제어 할 수 있습니까? 또는 사용자가 새 스레드에서 작업 할 때까지 주 스레드를 잠자기() 할 수 있으며 사용자가 주 스레드로 돌아가서 그 스레드를 다시 시작할 수있게하려면 어떻게 할 수 있습니까?

+0

을 사용하면 도움이 될 수있는 'yield' 방법이 있습니다. 그런데, 나는 매우 추천한다. 프로그래밍 동시성 튜토리얼 동굴 – Coffee

+0

종종 성능 문제 및 기타 신비한 버그가 발생하기 때문에 수동으로 스레드를 예약하는 것을 권장하지 않습니다. 아키텍처를 다시 생각해보고 GUI/탭/등을 하나의 스레드로 생각하고 백그라운드에서 응용 프로그램 상태를 최신 상태로 유지하는 다른 스레드로 생각하는 것이 좋습니다. – xea

+3

나는 실제로 쓰레드를 전혀 사용하지 않을 것이다. 여러 개의 탭은 병렬로 작동하지 않고 순차적으로 작동하며 단일 스레드가 이미 수행 할 수 있습니다. 당신이 가지고있는 것은 "상태"입니다. 그러나 그것이 각 인스턴스가 자신의 상태를 가지고있는 객체가있는 이유입니다. – zapl

답변

0

우선 코드에서 기본적인 실수는 check=="true"이 항상 false이라는 것입니다.

당신은 check.equals("true")로 변경하여 신속하게 해결할 수 있지만, 당신은뿐만 아니라 적절하게 문제를 해결할 수 있습니다

  • 변경 String checktrue
  • "false" 변경 "true"
  • false로 변경
  • boolean check

두 번째로, 제 제안은 다음과 같습니다. f 또는 일반적인 스레딩 기법 :

단계 # 1 - 대신 Thread 클래스를 확장하는을의 Runnable 인터페이스를 구현 :

public class MyClass implements Runnable 
{ 
    public MyClass(String input) 
    { 
     this.input = input; 
    } 

    public String getOutput() 
    { 
     return output; 
    } 

    public void run() 
    { 
     ... 
     output = ...; 
    } 

    private String input = null; 
    private String output = null; 
} 

단계 # 2 - 목록에있는 모든 스레드를 저장, 각각의 스레드를 시작하고 각 스레드에 가입 :

public static ArrayList<String> run(ArrayList<String> inputs,long maxMillisPerThread) 
{ 
    ArrayList<MyClass> myObjects = new ArrayList<MyClass>(); 
    ArrayList<Thread> threads = new ArrayList<Thread>(); 
    ArrayList<String> outputs = new ArrayList<String>(); 
    for (String input : inputs) 
    { 
     MyClass myObject = new MyClass(input); 
     Thread thread = new Thread(myObject); 
     myObjects.add(myObject); 
     threads.add(thread); 
     thread.start(); 
    } 
    for (Thread thread : threads) 
    { 
     try 
     { 
      thread.join(maxMillisPerThread); 
     } 
     catch (Exception error) 
     { 
     } 
    } 
    for (MyClass myObject : myObjects) 
    { 
     outputs.add(myObject.getOutput()); 
    } 
    return outputs; 
} 

3 단계 - CR을 각 스레드에 대해 원하는 입력을 만들어 위 함수에 전달하십시오. 예를 들어 :

ArrayList<String> inputs = new ArrayList<String>(); 
for (int i=0; i<...; i++) 
    inputs.add(...); 

ArrayList<String> outputs = run(inputs,3000); 
for (String output : outputs) 
    System.out.println(output); 
+0

나는 단순히 코드 아래에 서 있거나 무엇을하는지, 내 문제를 해결하는 데 어떻게 도움이 될지 모르겠다. 두 번째로는 내 루프가 잘 작동하는 것처럼 보인다. – user3085866

+0

내 일반적인 제안은'class Thread'를 확장하는 대신'interface Runnable'을 구현하는 것이다. 작성한 모든 스레드를 스레드 목록에 저장하고 모든 스레드를 하나씩 시작한 다음 모든 스레드를 하나씩 조인하십시오. 하지만이 게시물이 도움이되지 않으면 제거 할 것입니다. –

+0

미안하지만 저는 제 정신이 들지 만 미안하지만 요점을 알고 있다고 생각하지 않거나 충분히 명확하지 않을 수도 있습니다. – user3085866

0

당신은 항상 일반적으로 (사용자 입력 등을 처리, 그림 구성 요소) UI 작업에 사용되는 하나의 하나 하나의 "주"스레드를해야합니다. 적어도 UI 작업을 위해서는이 탭을 모든 탭에 사용해야합니다.

비록 각 탭마다 하나의 스레드가있을 수 있습니다.이 탭 (즉, 화면 그리기를 제외한 거의 모든 것)에서 컴퓨팅 연산을 수행하는 데 사용됩니다. 스레드간에 "전환"할 필요가 없으며 동시에 실행됩니다. 주 스레드와 이러한 탭 스레드간에 일종의 통신 메커니즘 만 있으면됩니다.이 통신에 사용하는 것은 주로 사용중인 UI 스택에 따라 다릅니다 (swing? android? other?).

메인 스레드는 항상이 스레드에서 실행할 개미 작업을 게시하는 데 사용할 수있는 일종의 실행 루프 메커니즘 (GUI 툴킷에서 제공)을 가지고 있습니다. Java에는 스레드 통신 유틸리티가 있지만 UI 및 탭에 대해 말하면서 실제로 개발중인 툴킷을 알고 자체 메커니즘을 사용해야합니다. 예를 들어 Swing의 경우 SwingWorkerSwingUtilities#invokeLater

+0

어떻게 메인 스레드에 액세스합니까? 메인 스레드가 메인 스레드가 만든 스레드에 메시지를 보내려면 어떻게합니까? – user3085866

+0

저는 현재 UI 스택을 사용하고 있지 않습니다. 메인 스레드가 다른 스레드로 특정 스레드로 작업을 보내길 원합니까? – user3085866

+0

실제로 원하는 것은 스레드간에 전환하는 것입니다. 가능합니까? 선택 사항이 주어지면 사용자가 여러 개의 스레드를 열었습니다. 4 개의 스레드라고 말할 수 있습니다. 이제 스레드 2에 가고 싶습니다. 어떻게해야합니까? – user3085866

관련 문제