190508_Day21 복습

<스레드>

  • 프로세스내에서 순차적으로 동작하는 문장들의 단일집합(메소드)

  • 사용이유? 하나의 응용프로그램내에서 독립적으로 동시 실행(기다리지 않는) 하는 기능이 존재

  • 구현방법) 클래스 Thread, 인터페이스 Runnable

    class MyThread1 extends Thread { public void member() { Thread.start(); //혹은 start(); Thread내부니까 } public void run() //스레드 메소드 { //동시실행할 문장들 } } class Mythread2 implements Runnable { public void run() //스레드 메소드 { //동시실행할 문장들 } public void member() { Thread t = new Thread(this); t.start(); // new Thread(this).start(); } }
  • 호출방법) run()메소드를 직접 호출하는것이 아님!

    • start()메소드에게 위임해야 함! (thread 클래스 밑에 있음)

  • 문제) 위의 두개의 run()메소드를 start()를 통해 호출하시오!

    MyThread1 m1 = new MyThread1(); //스레드객체 MyThread2 m2 = new MyThread2(); //Runnable객체 m1.start(); //됨 m2.start(); //안됨
    • 스레드 객체를 별도로 반드시 생성!

    • Thread t = new Thread(Runnable객체의 위치);

    • Thread t = new Thread (m2);

    • t.start();

    • 위의 코드를 줄여서 : new Thread(m2).start();

package j0508; class MyThread extends Thread{ public MyThread(String name) { super(name); // 이렇게 안하면 이름 출력되지 않는다. new Thread(String name); 을 호출한것 } //스레드 특징 메소드 ---> run : start()메소드를 통해 호출해야 동시 실행이 가능!! public void run() { try { for(int i=1; i<11; i++) { Thread.sleep(500);//0.5초 대기 System.out.println(getName()+" : "+ i); } } catch (InterruptedException e) { e.printStackTrace(); } }//run } public class ThreadTest2 { public static void main(String[] args) { //스레드의 기본이름 : Thread-0 Thread-1 Thread-2 //스레드에 이름 부여하기!! MyThread t1 = new MyThread("비키스레드"); MyThread t2 = new MyThread("진주스레드"); MyThread t3 = new MyThread("용진스레드"); //스레드 우선 순위 부여 (1~10) 10:가장 높고, 기본값은 5 t2.setPriority(Thread.MAX_PRIORITY); t3.setPriority(Thread.MIN_PRIORITY); t1.setPriority(Thread.NORM_PRIORITY); t1.start(); t2.start(); t3.start(); } }

    • TVContribution.java => 방송국(main)

    • Customer.java => 경쟁적인 모금자(스레드)

    • Account.java => 모금함(저금통)

    package j0508; public class TVContribution { public static void main(String[] args) //모금자 5명을 모집 { Account account = new Account(); // Customer c1 = new Customer(account); // Customer c2 = new Customer(account); // Customer c3 = new Customer(account); // Customer c4 = new Customer(account); // Customer c5 = new Customer(account); //c1부터 c5까지는 Thread객체 //1차원 배열 객체생성식 : 자료형 []배열명 = new 자료형[배열크기]; Customer[] customers = new Customer[5]; // customers = {null, null, null, null, null}; for(int i = 0; i < customers.length; i++) { customers[i] = new Customer(account); } //모금 시작 for (int i = 0; i < customers.length; i++) { // c1.start(); == customers[0].start(); customers[i].start(); // 스레드 시작 } //실행한 스레드가 종료할때까지 return 기다리자! try { for (int i = 0; i < customers.length; i++) { customers[i].join(); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("총 모금액 : " + account.getTotal()); } }package j0508; public class Customer extends Thread//모금자 (스레드 - 경쟁적인) { Account account; public Customer(Account account) { this.account = account; } @Override public void run() { try { for( int i = 1; i <= 200; i++ ) { Thread.sleep(50);//0.05초 간격 account.deposit(1000); //모금 System.out.println(getName() + " : " + i + "회" ); if(account.getTotal() >= 500000) { break; } }//for } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }package j0508; public class Account // 모금함(저금통) { private int total; public synchronized void deposit(int account) { total += account; /* * LOAD total * ADD account * SAVE total * * 동기화 (Synchronized) * -메소드 동기화 * (메소드에 진입한 스레드가 있을 경우 다른 스레드들은 대기(LOCK)하게 하는 역할) * -블럭 동기화 ( 특정영역 동기화 ) * synchronized(동기화객체){} * * 예) synchronized(this) * { * total += account; * } 도 가능 */ } public int getTotal() { return total; } }package j0508; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; public class MoveThreadTest extends JFrame implements ActionListener, Runnable{ JLabel la; JButton bt_start,bt_stop; int x,y; Thread t1; boolean start;//기본값 false; public MoveThreadTest() { setTitle("진주푸푸가 움직인다고?!"); ImageIcon icon = new ImageIcon("src/image/jin.png"); bt_start = new JButton("시작"); bt_stop = new JButton("정지"); la = new JLabel(icon); //bt_start.setBounds(x, y, width, height); bt_start.setBounds(20,420, 80,30); bt_stop.setBounds(120,420, 80,30); la.setBounds(x, y, 80, 70); setLayout(null); add(bt_start); add(bt_stop); add(la); setBounds(200,200, 500,500); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); bt_start.addActionListener(this); bt_stop.addActionListener(this); }//생성자 public void run() { //값 이동 // la.setLocation(5,0,56,56); try { while(true) { if(!start)break; System.out.println(x); if(x<=400) { x+=5; la.setLocation(x,0); Thread.sleep(20); }else if(y<=400) { y+=5; la.setLocation(x,y); Thread.sleep(20); } } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent e) { Object ob = e.getSource(); if(ob==bt_start) { start=true; t1 = new Thread(this); t1.start(); }else if(ob == bt_stop) { start=false; // t1.stop(); } } public static void main(String[] args) { new MoveThreadTest(); } }

 


 

  • java.net.*;

    <InetAddress>

    • IP주소를 다루기 위한 클래스 XXX.XXX.XXX.XXX XXX: 0~255

    주요메소드) byte[] getAddress() static InetAddress[] getAllByName(String host) static InetAddress getByName(String host) String getHostAddress() String getHostName() <URL> Uniform Resource Location

    http://www.gildong.co.kr:80/test/hello.jsp?name=gildong&age=13&job=student#index1

    프로토콜: 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약(http) 호스트명: 자원을 제공하는 서버의 이름 www.gildong.co.kr 포트번호: 통신에 사용되는 서버의 포트번호 80 경로명: 접근하려는 자원이 저장된 서버상의 위치 /test/ 파일명: 접근하려는 자원의 이름 hello.jsp 쿼리(query): URL에서 '?'이후의 부분 name=gildong&age=13&job=student 참조(anchor): URL에서 #이후의 부분

    <URLConnection>

    • 어플리케이션과 URL간의 통신연결을 나타내는 클래스의 최상위 클래스

    • URLConnection을 사용해서 연결하고자 하는 자원에 접근하고 읽고 쓰기를 할 수 있다.

package j0508; import java.io.BufferedReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.MalformedURLException; import java.net.URL; public class URLTest { public static void main(String[] args) { String total = null; try { URL url = new URL("https://www.naver.com/index.html"); System.out.println("프로토콜 : " + url.getProtocol()); System.out.println("호스트 : " + url.getHost()); System.out.println("서비스파일 : " + url.getFile()); InputStream is = url.openStream(); //웹소스 읽기 => 화면 콘솔 출력 BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); String str; while((str = br.readLine()) != null) { total += str; } FileWriter fw = new FileWriter("C:\\Users\\Playdata\\Documents\\test.html"); fw.write(total); fw.close(); //미션) 읽어드린 웹소스를 파일(test.html)로 저장하고 // 탐색기에서 'test.html'을 더블클릭해서 해당 사이트를 접속하시오 //파일 생성 => File //폴더(디렉토리) 생성=> } catch (MalformedURLException e) { System.out.println("잘못된 주소입니다. 다시 한번 확인 해주세요"); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

이렇게 하면 깨지니

아래 처럼 해야 한다.

package com.encore.j0508; import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.MalformedURLException; import java.net.URL; public class URLTest { public static void main(String[] args) { try { URL url = new URL("https://www.naver.com/index.html"); System.out.println("프로토콜: "+ url.getProtocol()); System.out.println("호스트: "+ url.getHost()); System.out.println("서비스파일명: "+ url.getFile()); InputStream is = url.openStream(); //웹소스 읽기 ----------> 화면 콘솔 출력 BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8") ); String str; // while( (str=br.readLine()) != null ) { // System.out.println(str); // } //미션) 읽어들인 웹소스를 파일(test.html)로 저장하고 // 탐색기에서 'test.html'을 더블클릭해서 해당 사이트를 접속하시오. //파일생성 ==> FileOutputStream, FileWriter //폴더(디렉토리)생성==> File //FileWriter fw = new FileWriter("test.html"); ---> 문자집합 설정X //new OutputStreamWriter(OuputStream out, String charsetName) FileOutputStream fos = new FileOutputStream("test.html"); OutputStreamWriter osw = new OutputStreamWriter(fos , "UTF-8"); while( (str=br.readLine()) != null ) { //fw.write(str); osw.write(str); } //fw.close(); osw.close(); System.out.println("파일(test.html)생성 성공!!"); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }//main }

+ Recent posts