본문 바로가기

프로그램언어/자바

스레드1

프로세스란?

프로세스(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