스레드(Thread)
1. 스레드(Thread)
- 하나의 응용프로그램에서 여러개의 작업을 경량의 프로세스로 나누어 실행하는것
- 시간이 오래지연되는 작업이나,동시에 실행되어야 하는 작업이 있을때 스레드로 만든다.
예) 파일복사하기(시간이지연되는작업), 파일다운로드받기(동시에다운받기)
프린터로출력하기,게임프로그램에서 이미지를동시에이동하기,...
- 만드는 방법
방법1) Thread클래스를 상속받아 만들기
- Thread클래스를 상속받아 run메소드를 오버라이딩한다.
스레드를 실행할때는 start메소드를 사용한다.
방법2) Runnable인터페이스를 상속받아 만들기
ex>1.스레드클래스 상속받아 만들기.
package test02.thread;
//방법1)
//1.스레드클래스 상속받기
class MyPrinter extends Thread{
//2.run메소드 오버라이딩하기
public void run(){
for(int i=1;i<=1000;i++){
System.out.print("프린터로 출력중.....");
if(i%10==0) System.out.println();
}
}
}
public class Test01_Thread {
public static void main(String[] args){
//스레드객체 생성하기
MyPrinter mp=new MyPrinter();
//스레드로 구동하기==>start메소드가
// 내부적으로 run메소드호출
mp.start();
//printer();
for(int i=1;i<=1000;i++){
System.out.print("문서작업중.....");
if(i%10==0) System.out.println();
}
}
/-
public static void printer(){
for(int i=1;i<=1000;i++){
System.out.print("프린터로 출력중.....");
if(i%10==0) System.out.println();
}
}*-
}
ex>
package test02.thread;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class Test02_Thread{
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
while(true){
System.out.println("1.파일복사 2.디렉토리크기 3.종료");
int n=scan.nextInt();
switch(n){
case 1:filecopy();break;
case 2:long size=getSize(new File("c:\\java"));
System.out.println("디렉토리크기:" + size +"bytes");
break;
case 3:System.exit(0);
}
}
}
//파일복사하는 기능
public static void filecopy(){
try{
FileInputStream fis=new FileInputStream("c:\\java\\java.exe");
FileOutputStream fos=new FileOutputStream("c:\\java\\copy.exe");
byte[] b=new byte[50];
int n=0;
while((n=fis.read(b))!=-1){
fos.write(b,0,n);
}
fos.close();
fis.close();
System.out.println("[[[[[[[[[ 파일복사성공!!!! ]]]]]]]]]]]]");
}catch(IOException ie){
System.out.println(ie.getMessage());
}
}
public static long getSize(File f){
long size=0;
File list[]=f.listFiles();
for(File ff:list){
if(ff.isFile()){
size+=ff.length();
}else{
size+=getSize(ff);
}
}
return size;
}
}
ex>
package test02.thread;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
class FileCopyThread extends Thread{
public void run(){
try{
FileInputStream fis=new FileInputStream("c:\\java\\java.exe");
FileOutputStream fos=new FileOutputStream("c:\\java\\copy.exe");
byte[] b=new byte[50];
int n=0;
while((n=fis.read(b))!=-1){
fos.write(b,0,n);
}
fos.close();
fis.close();
System.out.println("[[[[[[[[[ 파일복사성공!!!! ]]]]]]]]]]]]");
}catch(IOException ie){
System.out.println(ie.getMessage());
}
}
}
public class Test03_Thread {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
while(true){
System.out.println("1.파일복사 2.디렉토리크기 3.종료");
int n=scan.nextInt();
switch(n){
case 1:FileCopyThread thread=new FileCopyThread();
thread.start();
break;
case 2:long size=getSize(new File("c:\\java"));
System.out.println("디렉토리크기:" + size +"bytes");
break;
case 3:System.exit(0);
}
}
}
public static long getSize(File f){
long size=0;
File list[]=f.listFiles();
for(File ff:list){
if(ff.isFile()){
size+=ff.length();
}else{
size+=getSize(ff);
}
}
return size;
}
}
ex> 방법2 >>
package test02.thread;
//1. Runnable 인터페이스 상속받기
class FileCopy implements Runnable{
//2. run메소드 오버라이딩하기
public void run() {
for(int i=1;i<=100;i++){
System.out.println("파일복사중...");
try{
//스레드를 1초동안 지연시키기
Thread.sleep(1000);
}catch(InterruptedException ie){
System.out.println(ie.getMessage());
}
if(i%10==0) System.out.println();
}
System.out.println("파일복사완료!!!!");
}
}
public class Test04_Runnable {
public static void main(String[] args) {
//3. Runnable자식객체 생성
FileCopy fc=new FileCopy();
//4. Thread클래스를 이용해서 스레드로 구동시키기
Thread th=new Thread(fc);
th.start();
//new Thread(fc).start();
for(int i=1;i<=100;i++){
System.out.println("문서작업중...");
try{
Thread.sleep(1000);//1초동안 스레드 지연시키기
}catch(InterruptedException ie){
System.out.println(ie.getMessage());
}
if(i%10==0) System.out.println();
}
}
}
ex> 1초에 한번씩 현재 시간을 얻어와 출력하는 스레드와
1초에 한번씩 난수를 얻어와 출력하는 스레드를 만들고 실행시켜 보세요.
package test02.thread;
import java.util.Calendar;
import java.util.Random;
class TimeThread extends Thread{
public void run() {
while(true){
Calendar cal=Calendar.getInstance();
String t=cal.get(Calendar.HOUR_OF_DAY) + "시" +
cal.get(Calendar.MINUTE) +"분" +
cal.get(Calendar.SECOND) +"초";
System.out.println(t);
try{
Thread.sleep(1000);
}catch(InterruptedException ie){
System.out.println(ie.getMessage());
}
}
}
}
class RndThread implements Runnable{
public void run(){
Random rnd=new Random();
while(true){
int n=rnd.nextInt(100);
System.out.println("난수:"+ n);
try{
Thread.sleep(1000);
}catch(InterruptedException ie){
System.out.println(ie.getMessage());
}
}
}
}
public class Quiz01 {
public static void main(String[] args) {
//TimeThread tt=new TimeThread();
//tt.start();
new TimeThread().start();
new Thread(new RndThread()).start();
}
}
ex> Message.java