Backend/JAVA

JAVA 코딩 API (Application Programming Interface) - Thread

쏠솔랄라 2023. 3. 2. 09:14

 

 

API - Thread

 

class CharPrint extends Thread {

private char start;

private char end;

 

public CharPrint(char start, char end) {

this.start = start;

this.end = end;

}

 

@Override

public void run() { // Thread가 실행하는 동안 실행되는 코드를 적는 메소드

char c = start;

 

while(c < end) {

String str = "";

for(int i = 1; i <= 20; i++) {

str += c++;

if(c == end) {

break;

}

}

System.out.println(getName() + " : " + str);

}

}

}

 

public class Test01 {

/*

Thread

두 개 이상의 코드를 동시에 실행할 수 있도록 만드는 것

구현 방식

Thread 클래스 상속

Runnable 인터페이스 상속

익명 중첩 클래스

*/

 

public static void main (String[] args) {

/* try {

Thread.sleep(100); // 현재 코드를 멈춰 주는 역할

} catch(InterruptedException e) {

e.printStackTrace();

}

*/

for (char c = 'ㄱ'; c < 'ㄴ'; c++) {

System.out.println(c);

}

 

System.out.println("===================================");

for (char c = '가'; c < '나'; c++) {

System.out.println(c);

}

 

System.out.println("========1===========================");

 

Thread t1 = new CharPrint('가', '나');

t1.start();

System.out.println("===================================");

Thread t2 = new CharPrint('나', '다');

t2.start();

 

for (int i = 1; i <= 10; i++) {

System.out.println("====================================");

}

}

}

 

 


 

 

import java.util.List;

import java.util.ArrayList;

 

class NumberSaver extends Thread {

List<Integer> list;

 

public NumberSaver(List<Integer> list) {

this.list = list;

}

 

@Override

public void run() {

for(int i = 1; i <= 10000; i++) {

synchronized(list) {

list.add(i);

}

}

System.out.println("[" + getName() + "] size = " + list.size());

}

/*

synchronized 동기화

여러개의 스레드에서 하나의 자원을 공유한다면 충돌로 인해 에러가 발생할 수도 있다

하나의 스레드가 접근하고 있으면 다른 스레드는 기다렸다가 접근하게 된다

-> 충돌로 인한 에러 방지

 

형식

synchronized (접근할 자원 대상) {

코드정의;

}

*/

}

 

 

public class Test02 {

public static void main (String[] args) throws InterruptedException {

 

List<Integer> list = new ArrayList<>();

 

NumberSaver t1 = new NumberSaver(list);

NumberSaver t2 = new NumberSaver(list);

 

t1.start();

t2.start();

 

// t1.join(10);

t2.join(); // 스레드가 종료될때까지 내가 지정한 시간까지만 () 기다리는 메소드

 

System.out.println(list.size());

}

}

 

 


 

 

import javax.swing.JOptionPane;

class Worker extends Thread {

 

@Override

public void run() {

for(int i =0; i<= 100000000; i++) {

boolean t = isInterrupted(); // Thread 상태 확인

System.out.println(i + "실행중..." + t);

 

if(t) {

break;

}

}

}

}

 

public class Test03 {

public static void main (String[] args) {

 

Worker w = new Worker();

// w.start();

 

w.setDaemon(true);

// 디폴트값 false, true로 설정하고 start를 걸면 자신을 제외한 가동 중인 스레드가 없으면 종료

 

try {

String cmd = JOptionPane.showInputDialog("명령 입력 : ");

 

while (true){

switch (cmd) {

 

case "start" :

w.start(); // start를 두 번 하게 되면 java.lang.IllegalThreadStateException 발생 ; 두 번 이상 실행하고 싶으면 객체를 별도로 만들어야 한다

break;

case "interrupt":

w.interrupt(); // 스레드 강제 종료 메소드

break;

case "join" :

w.join(); // 스레드가 종료될때까지 기다리는 메소드 ; 내가 지정한 시간까지만 기다림

break;

case "suspend" :

w.suspend(); // 스레드 일시정지

break;

case "resume" :

w.resume(); // 스레드 다시 시작

break;

case "stop" :

w.stop();

break; // 스레드 [강제] 종료 메소드

}

}

} catch (Exception e) {

}

 

// catch (InterruptedException e) {

// 스레드가 강제 종료되었을 때 exception 처리를 어떻게 할 것인가

// }

}

}

 

 


 

 

import java.util.Random;

import javax.swing.JDialog;

class Terror implements Runnable {

 

private String t;

public Terror(String t) {

this.t = t;

}

 

@Override

public void run() {

 

for (int i = 1; i <= 10; i++) {

JDialog d = new JDialog();

d.setTitle(t);

 

int s = 200 + new Random().nextInt(201); // 200~400

int x = new Random().nextInt(1001); // 0~1000

d.setSize(s, s);

d.setLocation(x, x);

d.setVisible(true); // 창 보이기

}

}

}

 

public class Test04 {

public static void main(String[] args) {

 

Terror r = new Terror("T E R R O R");

 

// r.run();

 

// Thread t = new Thread(r);

// t.start();

 

Thread t1 = new Thread(new Runnable() {

 

@Override

public void run() {

for(int i = 1; i <=10; i++) {

System.out.println("!!!!!!");

}

}

});

 

t1.start();

 

Thread t2 = new Thread() {

public void run() {

for(int i = 1; i <=10; i++) {

System.out.println("!!!!!!!!!!!!!!!");

}

};

};

 

t2.start();

 

}

}