Fairy ' s

[JAVA] Thread ? 본문

Study/JAVA

[JAVA] Thread ?

berafairy 2023. 1. 12. 09:12

Thread

// 참고

 


Thread

  • 스레드란 프로세스 내에서 실행되는 흐름의 단위이고, main() 안의 실행문들이 하나의 스레드이다.
  • 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다.
  • main() 이외의 스레드를 만드는 방법 : Thread 클래스 상속 , Runnable 인터페이스 구현 

 


Thread 클래스 상속

// import 생략

// DownloadThread 상속
import test.thread.DownloadThread;

public class Frame01 extends JFrame implements ActionListener {
	public Frame01() {
	    setTitle("Frame01");
	    setBounds(100, 100, 800, 500);
	    setDefaultCloseOperation(EXIT_ON_CLOSE);
	    setLayout(new FlowLayout());
	      
	    JTextField inputText=new JTextField(10);
	    add(inputText);
	      
	    JButton btn1=new JButton("눌러보셈");
	    add(btn1);
	    btn1.addActionListener(this);
	      
		setVisible(true);
	}
	   
	public static void main(String[] args) {
		new Frame01();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("버튼을 눌렀네요!");
	      
	    //새로운 스레드에서 다운로드 작업을 시킨다.
	    new DownloadThread().start();
	      
	    System.out.println("actionPerformed() 메소드가 종료 됩니다.");
    }
}

 

// DownloadTherad.java

public class DownloadThread extends Thread{

	@Override
	public void run() {
	      //완료하는데 10초가 걸리는 작업을 한다고 가정하자
	      try {
	         Thread.sleep(10000);
	         System.out.println("다운로드가 완료 되었습니다.");
	      } catch (InterruptedException e1) {
	         e1.printStackTrace();
	      }
	}
	

}
  • Thread를 상속받은 클래스를 만들어준 후 main()에서 .start()를 사용하여 실행

 


Thread 클래스 상속 받지 않고 main() 내에서 바로 사용

// import 생략

// DownloadThread 상속
import test.thread.DownloadThread;

public class Frame05 extends JFrame implements ActionListener{
   
   //생성자
   public Frame05() {
      setTitle("Frame05");
      setBounds(100, 100, 800, 500);
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      setLayout(new FlowLayout());
      
      JTextField inputText=new JTextField(10);
      add(inputText);
      
      JButton btn1=new JButton("눌러보셈");
      add(btn1);
      btn1.addActionListener(this);
      
      setVisible(true);
   }
   
   
   public static void main(String[] args) {
      new Frame05();
   }


   @Override
   public  void  actionPerformed(ActionEvent e) {
      System.out.println("버튼을 눌렀네요!");
      //익명의 내부 클래스를 이용해서 객체 생성후 새로운 작업단위를 시작한다. 
      
      new Thread() {
         @Override
         public void run() {
            //완료하는데 10초가 걸리는 작업을 한다고 가정하자
            try {
               Thread.sleep(10000);
               System.out.println("다운로드가 완료 되었습니다");
            } catch (InterruptedException e1) {
               e1.printStackTrace();
            }
         }
      }.start();
      
      System.out.println("actionPerformed() 메소드가 종료 됩니다.");
   }
   
}
  • new Thread를 이용하여 익명의 내부 클래스를 이용해서 객체 생성

 


Runnable 인터페이스 사용

// CountRunnable.java

public class CountRunnable implements Runnable{
	@Override
	public void run() {
		int count=0;
	    while(true) {
	    	try {
	    		Thread.sleep(1000);
	        } catch (InterruptedException e) {
	        	e.printStackTrace();
	        }
	        count++; //카운트를 증가 시킨다.
	        System.out.println("현재 카운트:"+count);
	        if(count==10) break;
            // 카운트가 10이 되면 반복문 탈출 => run()메소드종료  => 스레드 종료를 의미 
	    }
	}
}
  • Runnable 인터페이스에서 run을 오버라이드해주었다.

 

// import 생략

// CountRunnable, DownloadThread 상속
import test.runnable.CountRunnable;
import test.thread.DownloadThread;

public class Frame02 extends JFrame implements ActionListener{
   //생성자
   public Frame02() {
      setTitle("Frame02");
      setBounds(100, 100, 800, 500);
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      setLayout(new FlowLayout());
      
      JTextField inputText=new JTextField(10);
      add(inputText);
      
      JButton btn1=new JButton("눌러보셈");
      add(btn1);
      btn1.addActionListener(this);
      
      setVisible(true);
   }
   
   public static void main(String[] args) {
      new Frame02();
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      System.out.println("버튼을 눌렀네요!");
      
      Thread t=new Thread(new CountRunnable());
      t.start();
      
      System.out.println("actionPerformed() 메소드가 종료 됩니다.");
   }
   
}
  • 버튼을 누르면 이벤트가 발생하고, 버튼을 눌렀다는 메시지와 CountRunnable 클래스가 같이 실행된다.
  • CountRunnable 클래스를 통해 콘솔창에서 숫자가 1부터 10까지 1초마다 증가하고 10이되면 반복문을 탈출한다.

 


Runnable 클래스를 만들지 않고 main에서 사용

// import 생략

// CountRunnable, DownloadThread 상속
import test.runnable.CountRunnable;
import test.thread.DownloadThread;

public class Frame02 extends JFrame implements ActionListener{
	   //생성자
	   public Frame02() {
	       setTitle("Frame06");
	       setBounds(100, 100, 800, 500);
	       setDefaultCloseOperation(EXIT_ON_CLOSE);
	       setLayout(new FlowLayout());
	       
	       JTextField inputText=new JTextField(10);
	       add(inputText);
	      
	       JButton btn1=new JButton("눌러보셈");
	       add(btn1);
	       btn1.addActionListener(this);
	      
	       setVisible(true);
	   }
	   
	   
	   public static void main(String[] args) {
		   new Frame02();
	   }


	   @Override
	   public  void  actionPerformed(ActionEvent e) {
	      System.out.println("버튼을 눌렀네요!");
	      
		   new Thread(new Runnable() {
				
				@Override
				public void run() {
					int count=0;
				    while(true) {
				    	try {
				    		Thread.sleep(1000);
				        } catch (InterruptedException e) {
				        	e.printStackTrace();
				        }
				        count++; //카운트를 증가 시킨다.
				        System.out.println("현재 카운트:"+count);
				        if(count==10) break;
					// 카운트가 10이 되면 반복문 탈출 => run()메소드종료  => 스레드 종료를 의미 
				    }
				}
		   }).start();
	       System.out.println("actionPerformed() 메소드가 종료 됩니다.");
	  }
}
  • main 에서 run() 을 만들어 클래스를 따로 생성하지 않고 main() 내에서 바로 실행 

'Study > JAVA' 카테고리의 다른 글

[JAVA] 입출력스트림  (0) 2023.01.11
[JAVA] Exception / try ~ catch  (0) 2023.01.11
[JAVA] Wrapper Class ?  (0) 2023.01.11
[JAVA] Generics Class ?  (0) 2023.01.10
[JAVA] ArrayList ?  (0) 2023.01.10
Comments