[Day 12] 국비 0412 - 내용 정리
🌞멀티스레드
- 스레드: 실행 중인 메소드를 스레드라고 한다.
- 멀티스레드: 두 개 이상의 메소드를 가능하면 공평하게 실행시키는 프로그래밍 방식
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();
}
}
Author And Source
이 문제에 관하여([Day 12] 국비 0412 - 내용 정리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rlaehdus0417/Day-12-국비-0412-내용-정리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)