본문 바로가기

한화시스템 BEYOND SW캠프/TIL

[6주차] 24.02.13 화요일

Java Programming

 

package com.encore.thread;

public class Prt {
    public void printChar(char charValue) {
        for (int i = 0; i < 10; i++) {
            System.out.print(charValue);
        }

        System.out.println();
    }
}

 

package com.encore.thread;

/*
    멀티쓰레드 환경에서 공유객체를 동시에 사용할 때 발생하는 문제를 해결하기 위해서는 동기화 작업이 필요하다.
    synchronized 키워드를 이용하는 방법이 있다.
 */
public class PrtThread implements Runnable {
    private Prt moniter;
    private char charValue;

    public PrtThread(char charValue, Prt moniter) {
        this.charValue = charValue;
        this.moniter = moniter;
    }

    @Override
    public void run() {
        synchronized (moniter) {
            for (int i = 0; i < 10; i++) {
                moniter.printChar(charValue);
            }
        }
    }
}

 

import com.encore.thread.Prt;
import com.encore.thread.PrtThread;

public class PrtThreadMain {
    public static void main(String[] args) {
        System.out.println("main thread start !!");

        Prt prt = new Prt();
        // prt.printChar('A');
        // System.out.println();

        PrtThread runnable01 = new PrtThread('A', prt);
        Thread thread01 = new Thread(runnable01);
        thread01.start();

        PrtThread runnable02 = new PrtThread('B', prt);
        Thread thread02 = new Thread(runnable02);
        thread02.start();

        PrtThread runnable03 = new PrtThread('C', prt);
        Thread thread03 = new Thread(runnable03);
        thread03.start();

        System.out.println("main thread end !!");
    }
}

 

package com.encore.thread;

/*
    자바에서 쓰레드의 대상이 되는 객체를 정의하고 싶다면?
    - extends Thread
    - implements Runnable   // 현업에서 권장하는 방식(extends는 단일상속만 가능하기 때문에)
 */

public class ShareObj implements Runnable {
    public ShareObj() {

    }

    // 쓰레드의 구현부
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.print(i + "\t");
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        System.out.println();
    }
}

 

package com.encore.thread;

public class DeadLockThreadFirst implements Runnable {
    private StringBuffer sb01, sb02;

    public DeadLockThreadFirst() {

    }

    public DeadLockThreadFirst(StringBuffer sb01, StringBuffer sb02) {
        this.sb01 = sb01;
        this.sb02 = sb02;
    }

    @Override
    public void run() {
        synchronized (sb01) {
            sb01.append("encore");
        }
        try {
            Thread.sleep(10000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        synchronized (sb02) {
            sb02.append("hanwha");
            System.out.println("first thread >>> " + sb01.toString() + sb02.toString());
        }
    }
}

 

package com.encore.thread;

public class DeadLockThreadSecond implements Runnable {
    private StringBuffer sb01, sb02;

    public DeadLockThreadSecond() {

    }

    public DeadLockThreadSecond(StringBuffer sb01, StringBuffer sb02) {
        this.sb01 = sb01;
        this.sb02 = sb02;
    }

    @Override
    public void run() {
        synchronized (sb02) {
            sb02.append("hanwha");
        }
        try {
            Thread.sleep(10000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        synchronized (sb01) {
            sb01.append("encore");
            System.out.println("second thread >>> " + sb02.toString() + sb01.toString());
        }
    }
}

 

import com.encore.thread.DeadLockThreadFirst;
import com.encore.thread.DeadLockThreadSecond;

public class DeadLockMain {
    public static void main(String[] args) {
        StringBuffer sb01 = new StringBuffer();
        StringBuffer sb02 = new StringBuffer();

        new Thread(new DeadLockThreadFirst(sb01, sb02)).start();
        new Thread(new DeadLockThreadSecond(sb01, sb02)).start();
    }
}

 

package com.encore.thread;

import java.io.BufferedReader;
import java.net.Socket;

public class SocketServerThread implements Runnable {
    private BufferedReader reader;
    private Socket socket;

    public SocketServerThread() {

    }

    public SocketServerThread(BufferedReader reader, Socket socket) {
        this.reader = reader;
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            while (true) {
                String msg = reader.readLine();
                System.out.println("from " + socket.getRemoteSocketAddress() + ">> " + msg);

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
                if (reader != null) {
                    socket.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class SocketClientMain {
    public static void main(String[] args) {
        Socket socket = null;
        BufferedWriter bw = null;
        try {
            socket = new Socket("192.168.0.85", 7777);
            System.out.println(socket + "연결됨......");

            // 소켓을 통해서 서버와 연결된 스트림을 만들어 놓는 작업
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            // 클라이언트 메시지를 얻기 위해서 만들어 놓은 스트림
            Scanner scan = new Scanner(System.in);
            while (true) {
                System.out.print("send message >> ");
                String msg = scan.nextLine();
                bw.write(msg);
                bw.newLine();
                bw.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();

        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 

import com.encore.thread.SocketServerThread;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServerMain {
    public static void main(String[] args) {
        ServerSocket server = null;
        Socket socket = null;
        BufferedReader reader = null;
        
        try {
            server = new ServerSocket(7777);
            System.out.println("Server Socket Ready....");
            while (true) {
                socket = server.accept();
                System.out.println(socket.getRemoteSocketAddress() + "에서 접속했습니다.");
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                new Thread(new SocketServerThread(reader, socket)).start();

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
                if (reader != null) {
                    socket.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 

package com.encore.lambda;

@FunctionalInterface
public interface ILambda {
    //	public void printInfo(String str);
    public int add(int x, int y);
}

 

package com.encore.lambda;

/*
    람다식
    화살표 함수(ES6)
    사용하는 이유는 -> 함수형 프로그램을 구현할 수 있고, 불필요한 코드를 줄여서 가독성을 높일 수 있다.

    public int add(int x, int y) {
        return x + y;
    }

    람다함수(익명함수 - annonymous function)
    (x, y) -> {x + y};
 */
 
public class LambdaDemo {
    /*
        public int add(int x, int y) {
            return x + y;
        }

        (int x, int y) -> {
            return x + y;
        }

        (x, y) -> x + y;
     */
}

 

package com.encore.lambda;

public class LambdaImpl implements ILambda {
//	@Override
//	public void printInfo(String str) {
//		System.out.println(str);
//	}

    @Override
    public int add(int x, int y) {
        return x + y;
    }
}

 

package com.encore.lambda;

import java.util.function.DoubleBinaryOperator;

public enum Operation {
//    PLUS("+") {
//        public double apply(double x, double y) {
//            return x + y;
//        }
//    },
//
//    MINUS("-") {
//        public double apply(double x, double y) {
//            return x - y;
//        }
//    };

    PLUS("+", (double x, double y) -> x + y),
    MINUS("-", (double x, double y) -> x - y),
    DIVIDE("/", (double x, double y) -> x / y);

    public final String symbol;
    public final DoubleBinaryOperator op;

    Operation(String symbol, DoubleBinaryOperator op) {
        this.symbol = symbol;
        this.op = op;
    }

    public String toString() {
        return symbol;
    }

    public double apply(double x, double y) {
        return op.applyAsDouble(x, y);
    }
}

 

import com.encore.lambda.ILambda;
import com.encore.lambda.Operation;

public class LambdaMain {
    public static void main(String[] args) {

// 		ILambda lambda = new ILambda() {
//
//			@Override
//			public void printInfo(String str) {
//			System.out.println(str);
//
//			}
//
//			@Override
//			public int add(int x, int y) {
//				return x+y ;
//			}
//
//		};
//		lambda.printInfo("hello");
//		System.out.println("add = "+lambda.add(10, 10));


//        ILambda lambda = (int x, int y) -> {
//            return x + y;
//        };
//        System.out.println("add = " + lambda.add(10, 10));


//		lambda.printInfo("hello");

//		ILambda lambda = new LambdaImpl();
//		lambda.printInfo("기존 코드 방식");

//		int result = lambda.add(10, 10);
//		System.out.println("add = " + lambda.add(10, 10));

//        int addSum = result((x, y) -> x + y);
//        System.out.println("add = " + addSum);

//        Thread thread = new Thread(new Runnable() {
//            @Override
//            public void run() {
//                for (int i = 0; i < 10; i++) {
//                    System.out.println(i);
//                }
//            }
//        });
//        thread.start();

//        Thread thread = new Thread(
//                () -> {
//                    for (int i = 0; i < 10; i++) {
//                        System.out.println(i);
//                    }
//                }
//        );
//        thread.start();

        System.out.println(Operation.DIVIDE.apply(2, 3));
    }

    public static int result(ILambda lambda) {
        return lambda.add(10, 10);
    }
}

'한화시스템 BEYOND SW캠프 > TIL' 카테고리의 다른 글

[6주차] 24.02.15 목요일  (1) 2024.02.15
[6주차] 24.02.14 수요일  (0) 2024.02.14
[5주차] 24.02.08 목요일  (0) 2024.02.08
[5주차] 24.02.07 수요일  (0) 2024.02.07
[5주차] 24.02.06 화요일  (0) 2024.02.06