Friday, July 13, 2007
MultiThread
Multi Thread
스레드란 ‘메서드가 동시에 실행되는것‘인데 이건 동시에 메서드작업이 진행된다는 의미이다. 여러개의 스레드가 동시에 작업이 진행될때 문제가 되는것이 바로 공유자원의 문제이다.
사용할수있는 자원은 한 개인데 그것을 여러개의 스레드가 동시에 이용하려고 할때 공유자원에 문제가 생긴다.
즉, 화장실은 한 개인데 것도 공용화장실이 한 개인데 기다리는사람이 3명일 경우 한명이 들어가면 나올때 까지 기다려야하는데 기다리지 않고 들어가면 문제가 발생하는것이다.
결국 기다리게 만드는 것이 해결책이라 할수 있겠다.
화장실에 들어가서 문을 잠그면 되는데 그것이 메모리에 락(Lock)을 거는 방법인데,한개의 스레드가 공유자원을 다 쓸때 까지 다른스레드들을 대기시키는 것이다.
이렇게 순서대로 사용하게하는기법을 동기화(Synchronization)라고 한다.
즉 줄서기인것이다
import java.io.*;
import java.util.*;
class Test{ //공유할자원을 한개 생성할 클래스
private int memory=100; //공유자원인 메모리
public int getMemory(){ //값을계산해서 변경할 메소드생성
return this.memory;
}
public void setMemory(int memory){ //계산된공유자원 저장할 메소드
this.memory=memory;
}
public void addMemory(int add){ //메모리에 값 더할 메소드
int m = this.getMemory(); //설정되어 있는값을 읽어들임 **중요부분**
try{
Thread.sleep(3000); //3초후에 동작
}catch(Exception e){
e.printStackTrace();
}
this.setMemory(m+add); //3초후에 메모리설정값에 add값을 더해서 변경
}
public void minusMemory(int min){ //메모리에 값을 뺄 메소드
int n = this.memory;
try{
Thread.sleep(200); //0.2초 후에 동작
}catch(Exception e){
e.printStackTrace();
}
this.setMemory(n-min); //0.2초 후에 메모리 설정값에 min값을 빼서 변경
}
}
class Donhak extends Thread{ //값을 더할스레드 생성
public void run(){
MultiThread.Test2.addMemory(50); //공유메모리의 50값을 더함
System.out.println("거기에50더하기 "+ MultiThread.Test2.getMemory()); //더해진 값을 출력
}
}
class Mina extends Thread{ //값을 빼는 스레드 생성
public void run(){
MultiThread.Test2.minusMemory(50); //공유메모리의 50값을 뺌
System.out.println("50빼기 "+ MultiThread.Test2.getMemory()); //빼진 값을 출력
}
}
public class MultiThread {
public static Test Test2 = new Test(); //Test와 같은 객체 Test2생성
public static void main(String[] args)throws Exception{ //메인 메소드
Donhak d = new Donhak(); //start를 할 객체 생성
Mina m = new Mina(); //start를 할 객체 생성
d.start(); //Donhak쓰레드 동작
try{
Thread.sleep(200);
}catch(Exception e){
e.printStackTrace();
}
m.start(); //Mina 스레드 동작
}
}
////////////////////////출력물///////////////////////////////
50빼기 50
거기에50더하기 150
이렇게 하면 Donhak이 **중요부분** 에서 100의 값을 읽어온후 3초간 기다린다.
그사이에 0.2초후에 Mina가 동작하는데 0.2초후에 100의 값을 읽어서 50을 뺀다.
그리고 설정값을 100에서 50으로 바꿔주는데, Donhak은 바뀐 50값에서 50을 더하는게
아니라 그전에 읽어들인 100의 값에서 50을 더하기 때문에 150의 값을 출력하게 된다
결국 공유자원에서의 순서의 문제로 오류가 발생한다. 은행에서 이럴경우 큰일난다.
####해결책#####
public synchronized void addMemory(int add){ //synchronized 메서드로 생성해서
//이메소드 안에서 생성되는 모든변수에 Lock가 걸리게 한다
int m = this.getMemory();
try{
Thread.sleep(3000);
}catch(Exception e){
e.printStackTrace();
}
this.setMemory(m+add);
}
public void minusMemory(int min){
synchronized(this){ //{}안에 현재 클래스에 사용된 맴버변수에 대한 동기화가 보장된다
int n = this.memory;
try{
Thread.sleep(200);
}catch(Exception e){
e.printStackTrace();
}
this.setMemory(n-min);
}
}
이렇게 synchronized 메소드를 사용해 addMemory에서 공유자원을 묶어줘야
Donhak이 작업을 할 3초를 기다린후에 Mina가 작업을해서 100에서 50을 더한수에
50을 빼게 된다.
//////////결과물////////
거기에50더하기 150
50빼기 100
}
Thursday, July 12, 2007
Wednesday, July 11, 2007
STUDY1 : Multi-Thread Programming
To do list
First, What is the Multi-Thread Programming?
Second, How to wirite the Multi-Thread Program?
First, What is the Multi-Thread Programming?
Second, How to wirite the Multi-Thread Program?
Thread.
//Runnable을 구현해서 만드는 스레드(스레드를 생성하는 방법)
class Top implements Runnable{ //Top로 인터페이스 생성 Runnable은 하나의
매소드(run())밖에 없는 인터페이스
public void run(){ //스레드가 동작시 작동하는 부분 start로 호출
for(int i=0; i<10; i++) //
System.out.print(i+"\t"); //
}
}
public class ThreadMain{ //
public static void main(String[] args){ //
System.out.println("프로그램 시작"); //스레드 시작전
Top t = new Top(); //Top형의 객체생성
Thread thd = new Thread(t); // Thread클래스로 스레드를만들때
//Runnable을 구현한 Top형의 객체를 넣어주고 만듬
thd.start(); //run()으로 독립적으로 스레드 동작시킴
System.out.println("프로그램 종료"); //스레드 동작후
}
}
//결과물은 프로그램시작->프로그램 종료->123456789 순서로 나온다 이유는
//프로그램 시작,과 종료가 출력되고난뒤에 스레드 작업이 진행되어서
//main도 하나의 스레드로 동작하다가 다른 스레드를 동작시키고 있어서
라인순으로 진행되지 않았다.
//Thread를 상속하는 스레드 만들기(Thread 상속)
class DerivedThread extends Thread{ //Thread를 직접 상속하는 클래스 생성
public void run(){ //스레드동작시 run의 재정의
for(int i=0; i<10; i++)
System.out.print(i+"\t");
}
}
public class DerivedThreadMain{ //스레드 생성할 클래스생성
public static void main(String[] args){
System.out.println("프로그램 시작"); //스레드 동작전
DerivedThread d = new DerivedThread(); //재정의된 DerivedThread형 객체생성
d.start(); //run동작
System.out.println("프로그램 종료"); //스레드 동작후
}
}
//Thread 클래스를 상속하는 것과 Runnable 인터페이스를 구현해서 하는것에는 큰 차이가 없는데 //인터페이스를 사용해서 하는이유는 내가 만든 클래스가 다른클래스를 상속했을 경우 자바에서는 다중상속이 //불가하기 때문에 Thread를 상속할수 없다 그러므로 인터페이스를 이용하여 Thread를 구현하는 방법을 사용한다.
class Top implements Runnable{ //Top로 인터페이스 생성 Runnable은 하나의
매소드(run())밖에 없는 인터페이스
public void run(){ //스레드가 동작시 작동하는 부분 start로 호출
for(int i=0; i<10; i++) //
System.out.print(i+"\t"); //
}
}
public class ThreadMain{ //
public static void main(String[] args){ //
System.out.println("프로그램 시작"); //스레드 시작전
Top t = new Top(); //Top형의 객체생성
Thread thd = new Thread(t); // Thread클래스로 스레드를만들때
//Runnable을 구현한 Top형의 객체를 넣어주고 만듬
thd.start(); //run()으로 독립적으로 스레드 동작시킴
System.out.println("프로그램 종료"); //스레드 동작후
}
}
//결과물은 프로그램시작->프로그램 종료->123456789 순서로 나온다 이유는
//프로그램 시작,과 종료가 출력되고난뒤에 스레드 작업이 진행되어서
//main도 하나의 스레드로 동작하다가 다른 스레드를 동작시키고 있어서
라인순으로 진행되지 않았다.
//Thread를 상속하는 스레드 만들기(Thread 상속)
class DerivedThread extends Thread{ //Thread를 직접 상속하는 클래스 생성
public void run(){ //스레드동작시 run의 재정의
for(int i=0; i<10; i++)
System.out.print(i+"\t");
}
}
public class DerivedThreadMain{ //스레드 생성할 클래스생성
public static void main(String[] args){
System.out.println("프로그램 시작"); //스레드 동작전
DerivedThread d = new DerivedThread(); //재정의된 DerivedThread형 객체생성
d.start(); //run동작
System.out.println("프로그램 종료"); //스레드 동작후
}
}
//Thread 클래스를 상속하는 것과 Runnable 인터페이스를 구현해서 하는것에는 큰 차이가 없는데 //인터페이스를 사용해서 하는이유는 내가 만든 클래스가 다른클래스를 상속했을 경우 자바에서는 다중상속이 //불가하기 때문에 Thread를 상속할수 없다 그러므로 인터페이스를 이용하여 Thread를 구현하는 방법을 사용한다.
thread
/* Runnable을 이용한 Thread */
//인터페이스 Runnable를 구현하여 run()재정의
//메인 메소드와 Top에 있는 run()메소드 동시에 작동
class Top implements Runnable{
//클래스 Top은 인터페이스 Runnable을 구현 - Runnable은 run()메소드 가지고 있음
public void run(){
//run()메소드 재정의
System.out.println("Runnable : Thread run!!");
//스레드 작동하는지 확인할 문자열 출력
}
}
public class Thread_1{
//스레드 생성할 클래스
public static void main(String args[]){ //메인 메소드
System.out.println("Thread start!!"); //문자열 출력
Top t = new Top();
//Top 형의 객체 생성 - Runnable을 구현하는 객체
Thread thd = new Thread(t);
//Thread 형의 객체 생성 (생성자에 Top형 객체생성한 것을 넣어줌)
thd.start();
//스레드 시작 - run()동작
System.out.println("Thread exit!!");
//문자열 출력
}
}
=================================================
/* 상속을 이용한 Thread */
//Thread 클래스를 직접 상속받아 run()메소드를 정의
//메인 메소드와 Top1에 있는 run()메소드 동시에 작동
class Top1 extends Thread {
//Thread 상속받는 클래스 Top1
public void run(){
//run()정의
System.out.println("Inheritance : Thread run!!");
//스레드 작동하는지 확인할 문자열 출력
}
}
public class Thread_2{
//스레드 생성할 클래스
public static void main(String[] args) {
//메인 메소드
System.out.println("Thread start!!");
//문자열 출력
Top1 t = new Top1();
//Top1형 객체 생성
t.start();
//스레드 작동 시킬 start()호출- Runnable을 이용한 방법과는 다르게
//Thread를 상속 받았기때문에 Thread 객체 생성할 필요없이 바로 start()호출가능
System.out.println("Thread end!!");
//문자열 출력
}
}
//인터페이스 Runnable를 구현하여 run()재정의
//메인 메소드와 Top에 있는 run()메소드 동시에 작동
class Top implements Runnable{
//클래스 Top은 인터페이스 Runnable을 구현 - Runnable은 run()메소드 가지고 있음
public void run(){
//run()메소드 재정의
System.out.println("Runnable : Thread run!!");
//스레드 작동하는지 확인할 문자열 출력
}
}
public class Thread_1{
//스레드 생성할 클래스
public static void main(String args[]){ //메인 메소드
System.out.println("Thread start!!"); //문자열 출력
Top t = new Top();
//Top 형의 객체 생성 - Runnable을 구현하는 객체
Thread thd = new Thread(t);
//Thread 형의 객체 생성 (생성자에 Top형 객체생성한 것을 넣어줌)
thd.start();
//스레드 시작 - run()동작
System.out.println("Thread exit!!");
//문자열 출력
}
}
=================================================
/* 상속을 이용한 Thread */
//Thread 클래스를 직접 상속받아 run()메소드를 정의
//메인 메소드와 Top1에 있는 run()메소드 동시에 작동
class Top1 extends Thread {
//Thread 상속받는 클래스 Top1
public void run(){
//run()정의
System.out.println("Inheritance : Thread run!!");
//스레드 작동하는지 확인할 문자열 출력
}
}
public class Thread_2{
//스레드 생성할 클래스
public static void main(String[] args) {
//메인 메소드
System.out.println("Thread start!!");
//문자열 출력
Top1 t = new Top1();
//Top1형 객체 생성
t.start();
//스레드 작동 시킬 start()호출- Runnable을 이용한 방법과는 다르게
//Thread를 상속 받았기때문에 Thread 객체 생성할 필요없이 바로 start()호출가능
System.out.println("Thread end!!");
//문자열 출력
}
}
Tuesday, July 10, 2007
Homework 2
How to make a Thread Programming...
it has two mrthods.
1. uses the Runnable interface inheritance
2. uses the Thread Class inheritance
you have to write a two Thread programs and must comment all program source code line by line.
deadline : July. 11. 2007
it has two mrthods.
1. uses the Runnable interface inheritance
2. uses the Thread Class inheritance
you have to write a two Thread programs and must comment all program source code line by line.
deadline : July. 11. 2007
Monday, July 9, 2007
JDBC Programming - login
Requirements:
1. input ID, Password
2. compares inputted id with ids from table of user in DATABASE
ex) select id from user;
and check the inputted id
ex)if (inputted id == ids[xx])
3. if inputted id exists,
you have to get a password which is matched inputted id.
ex)select password from user where id='inputted id';
3.1 if inputted password is vaild,
and you just have to print a success message "Login Success".
3.2 if not,
just print a failure message "Your password is wrong~~!!.
And input your password again."
3.3 and if re-inputted password is vaild,
just print "Login Success".
4. if not,
just print a failure message "You have to register".
1. input ID, Password
2. compares inputted id with ids from table of user in DATABASE
ex) select id from user;
and check the inputted id
ex)if (inputted id == ids[xx])
3. if inputted id exists,
you have to get a password which is matched inputted id.
ex)select password from user where id='inputted id';
3.1 if inputted password is vaild,
and you just have to print a success message "Login Success".
3.2 if not,
just print a failure message "Your password is wrong~~!!.
And input your password again."
3.3 and if re-inputted password is vaild,
just print "Login Success".
4. if not,
just print a failure message "You have to register".
Sunday, July 8, 2007
과제
접근제한자
public - 같은 클래스,같은 패키지,상속받은클래스,관계없는 클래스에서 전부사용가능하다
protected-public과 같고 관계없는 클래스에서 사용불가
package-같은 클래스와 같은 패키지 내에서만 사용가능
private-같은 클래스내에서만 사용가능
인터페이스-상수들과 추상메소드들의 집합
실체화 되지 않으며, 메소드는 기본public으로 공용가능하고 추상메소드를 구현해서 인터페이스를 구현,특히 특정 인터페이스를 구현한다고 선언했으면 인터페이스의 모든 메소드에대한 정의를 제공해야함
추상클래스
정의가 없는 한개이상의 추상메소드를 포함 but 객체를 생성할수 없음
추상메소드를 가진다는면에서 인터페이스와 추상클래스가 유사하나, 추상클래스는 인터페이스와 다르게 추상메소드가 아닌 메소드를 포함가능하고 상수 말고도 데이터선언도 포함할수 있다.
this - 자기자신을 가리킴.하나의 인스터스를 가리키는 자기 자신을 리턴할때사용
super - 부모 클래스를 가리키는 참조.super() 부모클래스 생성자가 호출된다
public - 같은 클래스,같은 패키지,상속받은클래스,관계없는 클래스에서 전부사용가능하다
protected-public과 같고 관계없는 클래스에서 사용불가
package-같은 클래스와 같은 패키지 내에서만 사용가능
private-같은 클래스내에서만 사용가능
인터페이스-상수들과 추상메소드들의 집합
실체화 되지 않으며, 메소드는 기본public으로 공용가능하고 추상메소드를 구현해서 인터페이스를 구현,특히 특정 인터페이스를 구현한다고 선언했으면 인터페이스의 모든 메소드에대한 정의를 제공해야함
추상클래스
정의가 없는 한개이상의 추상메소드를 포함 but 객체를 생성할수 없음
추상메소드를 가진다는면에서 인터페이스와 추상클래스가 유사하나, 추상클래스는 인터페이스와 다르게 추상메소드가 아닌 메소드를 포함가능하고 상수 말고도 데이터선언도 포함할수 있다.
this - 자기자신을 가리킴.하나의 인스터스를 가리키는 자기 자신을 리턴할때사용
super - 부모 클래스를 가리키는 참조.super() 부모클래스 생성자가 호출된다
과제1
1. 자바에서 접근 제한자의 의미?
접근제한자로서는 public,protected,private,package 이 네가지가 있다.
public은 현재 클래스,다른 클래스,다른파일등에서도사용할 수 있다.
protected는 자신의 클래스와 상속 관계의 클래스, 동일한 파일, 동일한 폴더에서만 사용할 수 있다.
private는 자신의 클래스 내부에서만 사용하도록 제한한다.
package는 접근제한자를 사용하지 않는 형태로서 자신의 클래스와 동일한 파일에서사용되도록 제한한다.
2. 추상 클래스와 인터페이스의 의미?
추상 클래스는 객체를 발생시키지 못하는 것으로 몸체가 없는 메소드를 가진 클래스를 말하며 직접 객체를 발생시킬 필요가 없고 상속에 의해서 하위클래스만 제어할 목적이면 추상클래스를 사용한다.
인터페이스는 몸체 없는 메소드의 집합으로만 되어 있는 클래스로 자바는 다중 상속을 지원하지 않지만 인터페이스를 이용하면 다중 상속의 개념을 지원 할 수 있다.
3. this와 super의 의미?
this : 클래스내에서 메소드의 변수와 지역변수의 이름이 같을 경우 this를 사용해서 구별한다.
super: 자식 클래스가 부모클래스를 상속받았을 때 자식 클래스에서 부모클래스를 재정의 하면 부모클래스의 메소드는무시된다. 그때 부모클래스의 변수를 참조할 수 있게 해주는 것이 super이다.
접근제한자로서는 public,protected,private,package 이 네가지가 있다.
public은 현재 클래스,다른 클래스,다른파일등에서도사용할 수 있다.
protected는 자신의 클래스와 상속 관계의 클래스, 동일한 파일, 동일한 폴더에서만 사용할 수 있다.
private는 자신의 클래스 내부에서만 사용하도록 제한한다.
package는 접근제한자를 사용하지 않는 형태로서 자신의 클래스와 동일한 파일에서사용되도록 제한한다.
2. 추상 클래스와 인터페이스의 의미?
추상 클래스는 객체를 발생시키지 못하는 것으로 몸체가 없는 메소드를 가진 클래스를 말하며 직접 객체를 발생시킬 필요가 없고 상속에 의해서 하위클래스만 제어할 목적이면 추상클래스를 사용한다.
인터페이스는 몸체 없는 메소드의 집합으로만 되어 있는 클래스로 자바는 다중 상속을 지원하지 않지만 인터페이스를 이용하면 다중 상속의 개념을 지원 할 수 있다.
3. this와 super의 의미?
this : 클래스내에서 메소드의 변수와 지역변수의 이름이 같을 경우 this를 사용해서 구별한다.
super: 자식 클래스가 부모클래스를 상속받았을 때 자식 클래스에서 부모클래스를 재정의 하면 부모클래스의 메소드는무시된다. 그때 부모클래스의 변수를 참조할 수 있게 해주는 것이 super이다.

