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();
}
}