**어제복습**


<심심이 프로그램> 쌤코드

아무말 입력하면 txt파일의 이름들 중 랜덤으로 하나 뽑아서 출력해주기


<서버메인>

package network;


public class SMain {


public static void main(String[] args) {

AServer a = new AServer();

try {

a.con();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}


<클라이언트메인>
package network;

public class CliMain {

public static void main(String[] args) {
Qclient sq = new Qclient();
try {
sq.sendMessage();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}


<서버>
package network;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;

public class AServer {
public void con() throws Exception {
ServerSocket ss = new ServerSocket(8282); //여긴 포트번호만 적으면 된다.
Socket sc = ss.accept();  // 연결됨?
// <클라이언트 메세지 수신>
InputStream is = sc.getInputStream();
InputStreamReader ir = new InputStreamReader(is); //byte
BufferedReader br = new BufferedReader(ir);
String message = br.readLine();
System.out.println("질문 : "+message);
// <클라이언트에게 메세지 송신>
OutputStream os = sc.getOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(ow);
//답 받아오기
String a = getAnswer();
bw.write(a);
bw.close();
br.close();
}
private String getAnswer(){
//디스크에 있는 파일 읽어 오기
//File f = new File("c:\\test\\woman.txt");
FileReader fi = null;
try {
fi = new FileReader("c:\\test\\woman.txt");
//file이 있을수도 있고 없을 수도 있으니 에러 > 예외처리 > try catch
BufferedReader br = new BufferedReader(fi);
String str = br.readLine();
String [] ar = str.split(",");
Random r = new Random();
int number = r.nextInt(ar.length);
return ar[number];
//while( (str=br.readLine()) != null ){}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null; // ??여긴 왜
}
}


<클라이언트>
package network;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class Qclient {

public void sendMessage() throws Exception{
Socket cc = new Socket("192.168.30.58",8282); //상대 ip주소
System.out.println("질문을 입력하세요.");
Scanner sc = new Scanner(System.in);
String message = sc.next();
// <서버로 메세지 전송>
OutputStream os = cc.getOutputStream(); //byte로 처리
OutputStreamWriter ow = new OutputStreamWriter(os); //char type?
BufferedWriter bw = new BufferedWriter(ow); //String 처리
bw.write(message+"\r\n");
bw.flush(); //강제로 버퍼 비움
// <서버에서 보낸 메세지 수신>
InputStream is = cc.getInputStream();
InputStreamReader ir = new InputStreamReader(is);
BufferedReader br = new BufferedReader(ir);
String s = br.readLine();
System.out.println("질문 : " +message); //내가 보낸 메세지
System.out.println("대답 : " +s); //서버에서 보낸 메세지
br.close();
bw.close();
}
}

******************************************************************


쓰레드


프로세스와 쓰레드


프로세스 : 실행 중인 프로그램, 자원(resources)과 쓰레드로 구성

쓰레드 : 프로세스 내에서 실제 작업을 수행. 모든 프로세스는 하나 이상의 쓰레드로 구성되어 있다.


프로세스는 공장

쓰레드는 일꾼


프로세르 : 쓰레드 = 공장 : 일꾼



****************************************************************


Thread 클래스 사용


예제


<메인>

package thread;


public class TestMain {


public static void main(String[] args) {

ThreadTest t = new ThreadTest("suji");

ThreadTest t2 = new ThreadTest("iu");


t.start();

t2.start();

}


}




>

메인에서 run()이 아니라 start()메소드 실행.  start()  : os에게 위임



<쓰레드>
// Thread 클래스에서 상속받고 
// run 메소드를 오버라이드한다.


package thread;

public class ThreadTest extends Thread {
public ThreadTest(String name) {
super(name);
}
@Override
public void run() {
for(int i=0 ; i<10 ; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(getName()+i);
}
super.run();
}
}

***


Thread.sleep(1000);   >> 1초동안 재운다. 균등하게 실행시키기 위함


***

처음엔 suji먼저 하고 iu 출력했으나 Thread 클래스 이용후 동시에 진행

(랜덤으로, 순서는 os마음)


Thread를 이용해 동시에 실행하는 것을 구현가능


*******************************************************************


주고 받는 것을 Thread로 처리해서 채팅프로그램 개선하기


Socket sc - ss,acept();   >>> 이 부분을 run() 안에 넣어서 쓰레드진행



********************************************************************


Thread 응용 : 채팅프로그램, 예매프로그램


*********************************************************************


TV 먹으면서 과자먹기 내가해본거


<메인>

package tvandeat;


public class EatTvMain {

public static void main(String[] args) {

Eat e = new Eat();

Tv t = new Tv();

e.start();

t.start();

}

}



<TV>
package tvandeat;

public class Tv extends Thread {

@Override
public void run() {
for(int i=0 ; i<10 ; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(i+"채널시청");
}
super.run();
}
}

<과자>
package tvandeat;

public class Eat extends Thread {
@Override
public void run() {
for(int i=0 ; i<10 ; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(i+"과자처묵처묵");
}
super.run();
}
}

***


TV보면서 과자먹기를 Runnable 인터페이스로 바꿔보자




************************************************************


Thread를 이용하는 또 다른 방법


Runnable 인터페이스 사용


Runnable 인터페이스는 run() 메서드를 구현하는 클래스를 선언


class RunTest imp




****************************************************


쓰레드의 상태 (state of thread) 

-교안참고


NEW         : 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태

RUNNABLE : 실행 중 또는 실행 가능한 상태

BLOCKED  : 동기화블럭에 의해서 일시정지된 상태(lock이 풀릴 때까지 기다리는 상태)


****************************************************


동기화 (synchronized)


방법2개


1.메소드의 동기화  : 오늘할 것 


2.특정 블록의 동기화



*******************************************************


<집에오고 화장실와서 큰거하고 나가고 다음사람 들어오기>



<싱크, 쓰레드>

package house;


public class House implements Runnable{

@Override

public void run() {

System.out.println(Thread.currentThread().getName()+"이 집에옴!");

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

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

toil();

}

}

public synchronized void toil(){

System.out.println(Thread.currentThread().getName()+"화장실 들어옴!");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("응가~");

System.out.println("시원~");

System.out.println("화장실에서 나감!");

}

}


<메인>
package house;

public class HouseMain {
public static void main(String[] args) {
House h = new House();
Thread t = new Thread(h,"suji");
Thread t2 = new Thread(h, "iu");
Thread t3 = new Thread(h, "나");
t.start();
t2.start();
t3.start();
}
}


결과

>

iu이 집에옴!

나이 집에옴!

suji이 집에옴!

iu화장실 들어옴!

응가~

시원~

화장실에서 나감!

나화장실 들어옴!

응가~

시원~

화장실에서 나감!




***

만약에 synchronized를 안 걸면 동시에 들어옴



******************************************************************


자바기본 끝


언급 안된 것


1.내부 클래스 (클래스 안의 클래스)

2.GUI




****************************************************************


블로그 이미지

테시리

,