[Day 12] Java 0412 - 내용 정리

Doyeon Kim·2022년 4월 12일
1

Java

목록 보기
14/16
post-thumbnail

🌞멀티스레드

  • 스레드: 실행 중인 메소드를 스레드라고 한다.
  • 멀티스레드: 두 개 이상의 메소드를 가능하면 공평하게 실행시키는 프로그래밍 방식
class Person {
	String name;
	
	public Person(String name) {
		this.name = name;
	}
	
	public void sayHello() {
		for(int i=1; i<=10; i++) {
			System.out.println("Hello" + name + "! " + i);
		}
 	}
}


public class PersonTest {

	public static void main(String[] args) {
		Person p1 = new Person("김유신");
		Person p2 = new Person("홍길동");
		p1.sayHello();
		p2.sayHello();

	}

}

<실행결과>

Hello김유신! 1
Hello김유신! 2
Hello김유신! 3
Hello김유신! 4
Hello김유신! 5
Hello김유신! 6
Hello김유신! 7
Hello김유신! 8
Hello김유신! 9
Hello김유신! 10
Hello홍길동! 1
Hello홍길동! 2
Hello홍길동! 3
Hello홍길동! 4
Hello홍길동! 5
Hello홍길동! 6
Hello홍길동! 7
Hello홍길동! 8
Hello홍길동! 9
Hello홍길동! 10
  • 메소드를 호출하면 호출한 순서대로 동작한다.
  • p1.sayHello()가 모두 끝나야지만 p2에게 기회가 온다.
  • 만약, p1의 sayHello()를 동작하다가 예외가 발생되어 중지되면 p2에게는 영영 기회가 오지 않을 수도 있다.
  • 이 때, 가능하면 p1과 p2가 공평하게 sayHello()를 동작하도록 하게 하려면 멀티스레드 방식으로 프로그래밍 한다.

🌞자바에서 멀티스레드 프로그래밍하기

  • Thread 클래스를 상속받아 공평하게 실행시키고자 하는 일을 run메소드를 오버라이딩하여 그 안에 써준다.

  • 객체를 생성하여 공평하게 일을 시키는 것을 스레드를 가동한다 라고 한다.

  • start() 메소드를 호출하여 가능하면 공평하게 일을 시킨다.

  • Runnable 인터페이스를 구현한 클래스를 만들고 run 메소드를 오버라이딩 하여 그 안에 공평하게 시키고자 하는 명령어들을 써준다.

  • 스레드를 가동시키기 위하여 Thread 객체로 포장하여 start()를 호출해야 한다.


🌞인터페이스를 사용하는 이유

  • 다중상속, 새로 만들려는 이미 있는 다른 클래스로부터 상속을 받아야하고 멀티스레드도 되어야 한다.
  • 자바는 클래스의 다중상속이 되지 않으므로 이 때에는 Runnable 인터페이스를 이용한다.
class MyBall extends JPanel implements Runnable {
		
		}

🌞스레드에 우선순위 설정하기

setPriority(int newPriority)
	우선순위에 설정할 수 있는 값은 1~10
	
	public static final int MAX_PRIORITY	10 			
	public static final int MIN_PRIORITY	1
	public static final int NORM_PRIORITY	5
  • 가능하면 일을 일찍 끝내달라고 요청하는 것이지 우선순위는 높이 설정했다고 하여 반드시 그 스레드가 작업은 먼저 완료하는 것은 아니다.

🌞paintComponent

  • 그래픽을 표현하려면 JPanel을 상속받아 paintComponent를 오버라이딩 하여 그래픽을 표현한다.
  • 이 객체를 생성하여 프레임에 담는다.

🌞임계영역

  • 두 개 이상의 스레드가 어떠한 변수를 공유하고 있을 때에 동시에 두 개의 스레드가 접근할 수 없고 한 번에 하나의 스레드에게만 접근하도록 하는 영역을 "임계영역" 이라고 한다.
  • 자바에서는 임계영역에 접근하는 메소드 앞에 synchronized 키워드를 붙여준다.

🌞스레드 사이의 통신

  • 스레드를 가동하면 가능하면 서로 공평하게 실행이 되게끔 스케줄링을 해준다.

  • 반드시 공평한 것은 아니다.

  • 만약, 반드시 공평하게 동작하도록 하려면 스레드 사이에 통신이 필요하다.

  • 상대방 스레드가 종료될 때 까지 내가 "기다리고" 내가 작업이 끝나면 기다리고 있는 상대방 스레드를 "깨워준다."

  • "기다리고," "깨워주는" 스레드 사이의 통신을 위한 메소드를 이용한다.

  • 스레드 사이의 통신을 위하여 Object의 wait 메소드와 notify 메소드를 이용한다.

🌈wait()

  • 다른 스레드가 일을 끝마칠 때 까지 기다린다.

🌈notify()

  • 내가 일이 끝나면 기다리고 있는 다른 스레드를 깨워준다.

🌞예제

🌟(멀티스레드)예제1🌟

//멀티쓰레드의 필요성
class Person {
	String name;
	
	public Person(String name) {
		this.name = name;
	}
	
	public void sayHello() {
		for(int i=1; i<=10; i++) {
			System.out.println("Hello" + name + "! " + i);
		}
 	}
}


public class PersonTest {

	public static void main(String[] args) {
		Person p1 = new Person("김유신");
		Person p2 = new Person("홍길동");
		p1.sayHello();
		p2.sayHello();

	}

}

🌟(멀티스레드)예제2🌟

class Person extends Thread {
	private String name;

	public Person(String name) {
		this.name = name;
	}

	@Override
	public void run() {
		for (int i = 1; i <= 10; i++) {
			System.out.println("Hello, " + name + " " + i);

			try {
				Thread.sleep(100); // 대기시간을 생성 , 컴퓨터를 0.1초 멈추도록 한다.
			} catch (Exception e) {

			}
		}
	}

}

public class PersonTest {

	public static void main(String[] args) {
		Person p1 = new Person("홍길동");
		Person p2 = new Person("이순신");
		
//		p1.run(); //일반메소드로 호출하여 p1이 끝나야만 p2를 실행함.
//		p2.run();
		
		p1.start(); //둘이 공평하게 실행할 수 있게 끔 
		p2.start();

	}

}

🌟(JPanel)예제2🌟

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;


class RedBall extends JPanel {

	@Override
	protected void paintComponent(Graphics g) {
		//빨간색으로 색상을 선택
		g.setColor(Color.red);
		
		//채운 원을 그리기.
		g.fillOval(10, 220, 30, 30);
	}
	
}


class MyFrame extends JFrame {
	
	RedBall rb;
	
	public MyFrame() {
		rb = new RedBall();
		add(rb);
		setSize(400, 300);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}



public class RedBallTest {

	public static void main(String[] args) {
		new MyFrame();
	}

}

🌞연습문제

👑연습문제1👑

import practice01.Count.CountDownEvent;

//pdf 01번문제 (쓰레드연습)

class Count extends Thread {
	protected int count;

	public Count(int count) {
		this.count = count;

	}

	@Override
	public void run() {
		for (int i = count; i >=1; i--) {
			System.out.println(i + "초 전입니다.");

			try {
				Thread.sleep(1000);
			} catch (Exception e) {

			}
		}
		System.out.println("발사 !!!");
	}

	class CountDownEvent extends Count {
		private int time;
		private String msg;
		public CountDownEvent(int count, int time) {
			super(count);
			this.time = time;
		}

		@Override
		public void run() {
			for (int i = 1; i <= 20; i--) {
				System.out.println(i + "초 전입니다.");

				try {
					Thread.sleep(100);
				} catch (Exception e) {
					System.out.println("대기시간이 지났습니다.");
				}
			}

		}
	}
}

public class ThreadPractice {

	public static void main(String[] args) {
		Count c = new Count(20);
//		CountDownEvent c1 = new CountDownEvent(20, 30, )
		c.start();
	}

}
profile
꾸준히 성장하는 개발자✨

0개의 댓글