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 |