프로세스란?
프로세스(process)란 단순히 실행 중인 프로그램이라고 할 수 있다.
스레드란?
스레드(thread)란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
모든 프로세스에는 한 개 이상의 스레드가 존재하며 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드라고 한다.
스레드 만들기
Thread 클래스 이용
Runnable 인터페이스 이용
Thread 클래스를 상속받아 스레드 만들기
Thread 클래스의 경로명은 java.lang.Thread 이다.
함수 | 설명 |
Thread() Thread(Runnable target) Thread(String name) Thread(Runn.. target, String name) |
스레드 객체 생성 Runnable 객체인 target을 이용하여 스레드 객체 생성 이름이 name인 스레드 객체 생성 Runnable 객체를 이용하여, 이름이 name인 스레드 객체 생성 |
void run() | 스레드 코드로서 JVM에 위해 호출된다. 스레드 코드를 작성한다. |
void start() | JVM에게 스레드 실행을 시작하도록 요청 |
void interrupt() | 스레드 강제 종료 |
static void yield() | 다른 스레드에게 실행을 양보, 스케줄링을 시행하여 다른 스레드를 선택하여 실행 |
void join() | 스레드가 종료할 때까지 기다린다. |
long getId() | 스레드의 ID값 리턴 |
String getName() | 스레드의 이름 리턴 |
int getPriority() | 스레드의 우선순위 값 리턴, 1에서 10 사이 값 |
void setPriority(int n) | 스레드의 우선순위 값을 n으로 변경 |
Thread State getState() | 스레드의 상태 값 리턴 |
static void sleep(long mills) | 스레드는 mills 시간 동안 잔다. mills의 단위는 밀리초 |
static Thread currentThread() | 현재 실행 중인 스레드 객체의 레퍼런스 리턴 |
Thread 클래스 상속받고 run()메소드 오버라이딩한다.
class ExThread extends Thread { //Thread 상속받음 @Override public void run() { // run() 오버라이딩 ...... } } |
Thread 시작은 start()함수 호출
예제
import java.lang.Thread;
class ExThread extends Thread { int n = 0;
@Override public void run() { while(true) { System.out.println(n); n++; try { sleep(1000); // 1초동안먼춤 }catch(InterruptedException e) { return; } } } }
public class Main {
public static void main(String[] args) { ExThread th = new ExThread(); th.start(); } } |
실행결과] 0 1 2 3 4 5 . . . |
청기, 백기 올려 프로그램을 작상해보자.
class WhiteFlag extends Thread { public void run() { while(true) { System.out.println("백기 올려"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } class BlueFlag extends Thread { public void run() { while(true) { System.out.println("청기 올려"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class WhiteBlueFlag {
public static void main(String[] args) { WhiteFlag wf = new WhiteFlag(); BlueFlag bf = new BlueFlag();
wf.start(); bf.start(); } } |
실행 결과] 백기 올려 청기 올려 백기 올려 청기 올려 백기 올려 청기 올려 백기 올려 청기 올려 백기 올려 청기 올려 백기 올려 청기 올려 백기 올려 청기 올려 청기 올려 백기 올려 백기 올려 청기 올려 백기 올려 청기 올려 청기 올려 백기 올려 백기 올려 청기 올려 청기 올려 백기 올려 청기 올려 백기 올려 백기 올려 ... ... ... 계속 |
Thread를 상속받아 1초 단위로 출력하는 타이머 스레드 만들기
import java.awt.*; import javax.swing.*;
class TimerThread extends Thread { private JLabel timerLabel; // 타이머 값이 출력되는 레이블
public TimerThread(JLabel timerLabel) { this.timerLabel = timerLabel; // 타이머 카운트를 출력할 레이블 } // 스레드 코드. run()이 종료하면 스레드 종료 @Override public void run() { int n=0; // 타이머 카운트 값 while(true) { // 무한 루프 timerLabel.setText(Integer.toString(n)); // 레이블에 카운트 값 출력 n++; // 카운트 증가 try { Thread.sleep(1000); // 1초 동안 잠을 잔다. } catch(InterruptedException e) { return; // 예외가 발생하면 스레드 종료 } } } }
public class ThreadTimerEx extends JFrame { public ThreadTimerEx() { setTitle("Thread를 상속받은 타이머 스레드 예제"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.setLayout(new FlowLayout());
// 타이머 값을 출력할 레이블 생성 JLabel timerLabel = new JLabel(); timerLabel.setFont(new Font("Gothic", Font.ITALIC, 80)); c.add(timerLabel); // 레이블을 컨텐트팬에 부착
// 타이머 스레드 객체 생성. 타이머 값을 출력할 레이블을 생성자에 전달 TimerThread th = new TimerThread(timerLabel);
setSize(300,170); setVisible(true);
th.start(); // 타이머 스레드의 실행을 시작하게 한다. }
public static void main(String[] args) { new ThreadTimerEx(); } } |
Runnable 인터페이스로 스레드 만들기
Runnable의 경로명은 java.lang.Runnable이다.
interface Runnable { public void run(); } |
예제
import java.lang.Thread; import java.lang.Runnable;
class ExThread implements Runnable { int n = 0;
@Override public void run() { while(true) { System.out.println(n); n++; try { Thread.sleep(1000); // 1초동안먼춤 }catch(InterruptedException e) { return; } } } }
public class Main {
public static void main(String[] args) { Thread th = new Thread(new ExThread()); th.start(); } } |
실행결과] 0 1 2 3 4 5 . . . |
Runnable 인터페이스를 이용하여 1초 단위로 출력하는 타이머 스레드 만들기
import java.awt.*; import javax.swing.*;
class TimerRunnable implements Runnable { private JLabel timerLabel; // 타이머 값이 출력된 레이블
public TimerRunnable(JLabel timerLabel) { this.timerLabel = timerLabel; // 초 카운트를 출력할 레이블 }
// 스레드 코드. run()이 종료하면 스레드 종료 @Override public void run() { int n=0; // 타이머 카운트 값 while(true) { // 무한 루프 timerLabel.setText(Integer.toString(n)); // 레이블에 카운트 값 출력 n++; // 카운트 증가 try { Thread.sleep(1000); // 1초동안 잠을 잔다. } catch(InterruptedException e) { return; // 예외가 발생하면 스레드 종료 } } } }
public class RunnableTimerEx extends JFrame { public RunnableTimerEx() { setTitle("Runnable을 구현한 타이머 스레드 예제"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.setLayout(new FlowLayout());
// 타이머 값을 출력할 레이블 생성 JLabel timerLabel = new JLabel(); timerLabel.setFont(new Font("Gothic", Font.ITALIC, 80)); c.add(timerLabel); // 레이블을 컨텐트팬에 부착
// 타이머 스레드로 사용할 Runnable 객체 생성. 타이머 값을 출력할 레이블을 생성자에 전달 TimerRunnable runnable = new TimerRunnable(timerLabel); Thread th = new Thread(runnable); // 스레드 객체 생성
setSize(250,150); setVisible(true);
th.start(); // 타이머 스레드가 실행을 시작하게 한다. }
public static void main(String[] args) { new RunnableTimerEx(); } } |
깜빡이는 문자열 을 가진 레이블 만들기
import java.awt.*; import javax.swing.*;
class FlickeringLabel extends JLabel implements Runnable { private long delay; // 배경색이 바뀌는 지연 시간. 밀리초 단위
public FlickeringLabel(String text, long delay) { super(text); // JLabel 생성자 호출 this.delay = delay; setOpaque(true); // 배경색 변경이 가능하도록 설정
Thread th = new Thread(this); th.start(); }
@Override public void run() { int n=0; while(true) { if(n == 0) setBackground(Color.YELLOW); else setBackground(Color.GREEN); if(n == 0) n = 1; else n = 0; try { Thread.sleep(delay); // delay 밀리초 동안 잠을 잔다. } catch(InterruptedException e) { return; } } } } public class FlickeringLabelEx extends JFrame { public FlickeringLabelEx() { setTitle("FlickeringLabelEx 예제"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.setLayout(new FlowLayout());
// 깜박이는 레이블 생성 FlickeringLabel fLabel = new FlickeringLabel("깜박", 500); // 500밀리초 주기로 배경색 변경
// 깜박이지 않는 레이블 생성 JLabel label = new JLabel("안깜박");
// 깜박이는 레이블 생성 FlickeringLabel fLabel2 = new FlickeringLabel("여기도 깜박", 300); // 300밀리초 주기로 배경색 변경
c.add(fLabel); c.add(label); c.add(fLabel2);
setSize(300,150); setVisible(true); }
public static void main(String[] args) { new FlickeringLabelEx(); } } |
'프로그램언어 > 자바' 카테고리의 다른 글
스윙 메뉴만들기 (0) | 2021.01.29 |
---|---|
스레드2 (0) | 2020.11.15 |
Collection 계열 클래스4 (0) | 2020.11.14 |
Collection 계열 클래스3 (0) | 2020.11.14 |
Collection 계열 클래스2 (0) | 2020.11.14 |