Search

λ©€ν‹° μŠ€λ ˆλ“œ

μŠ€λ ˆλ“œ

ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” κ°€μž₯ μž‘μ€ μ‹€ν–‰ λ‹¨μœ„μž…λ‹ˆλ‹€.
ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ μ•ˆμ—μ„œ μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ³‘λ ¬λ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
graph TD;
    A["ν”„λ‘œμ„ΈμŠ€"] --> B["μŠ€λ ˆλ“œ 1"];
    A --> C["μŠ€λ ˆλ“œ 2"];
    A --> D["μŠ€λ ˆλ“œ 3"];
    B --> E["독립적인 μ‹€ν–‰"];
    C --> F["곡유 μžμ› μ‚¬μš©"];
    D --> G["병렬 처리"];
    E --> H["μŠ€νƒ"];
    F --> I["νž™ λ©”λͺ¨λ¦¬"];
    G --> J["CPU μ‹œκ°„"];
    style A fill:#f9f,stroke:#333,stroke-width:2px;
    style B fill:#bbf,stroke:#333,stroke-width:2px;
    style C fill:#bbf,stroke:#333,stroke-width:2px;
    style D fill:#bbf,stroke:#333,stroke-width:2px;
Mermaid
볡사
μœ„ λ‹€μ΄μ–΄κ·Έλž¨μ€ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ μ•ˆμ—μ„œ μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μž‘ν•˜λŠ” 방식을 λ³΄μ—¬μ€λ‹ˆλ‹€. 각 μŠ€λ ˆλ“œλŠ” λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜λ©΄μ„œ λ™μ‹œμ— ν”„λ‘œμ„ΈμŠ€μ˜ μžμ›μ„ κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

JavaFX μ—μ„œ μŠ€λ ˆλ“œ μ‚¬μš©ν•˜κΈ°

JavaFX UI μŠ€λ ˆλ“œ

JavaFX μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ UI κ΄€λ ¨ μž‘μ—…μ€ μ£Ό μŠ€λ ˆλ“œ(JavaFX Application Thread)μ—μ„œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
Platform.runLater(() -> { // UI μ—…λ°μ΄νŠΈ μ½”λ“œ label.setText("데이터 μˆ˜μ‹  μ™„λ£Œ"); });
Java
볡사

μ†ŒμΌ“ 톡신 μŠ€λ ˆλ“œ

μ†ŒμΌ“ 톡신은 λ³„λ„μ˜ μŠ€λ ˆλ“œμ—μ„œ μ²˜λ¦¬ν•˜μ—¬ UIκ°€ λΈ”λ‘œν‚Ήλ˜μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€.
new Thread(() -> { try (Socket socket = new Socket("localhost", 8080)) { // μ†ŒμΌ“ 톡신 μ½”λ“œ InputStream input = socket.getInputStream(); // 데이터 μˆ˜μ‹  ν›„ UI μ—…λ°μ΄νŠΈ Platform.runLater(() -> updateUI(data)); } catch (IOException e) { e.printStackTrace(); } }).start();
Java
볡사

μŠ€λ ˆλ“œ κ°„ 톡신

β€’
μ†ŒμΌ“ μŠ€λ ˆλ“œμ—μ„œ 데이터λ₯Ό μˆ˜μ‹ ν•˜λ©΄ Platform.runLater()λ₯Ό μ‚¬μš©ν•˜μ—¬ UI μŠ€λ ˆλ“œμ— μ—…λ°μ΄νŠΈλ₯Ό μš”μ²­
β€’
λ°μ΄ν„°λŠ” μŠ€λ ˆλ“œ μ•ˆμ „ν•œ μ»¬λ ‰μ…˜(예: ConcurrentHashMap)을 μ‚¬μš©ν•˜μ—¬ 곡유
β€’
μŠ€λ ˆλ“œ κ°„ 동기화λ₯Ό μœ„ν•΄ synchronized λΈ”λ‘μ΄λ‚˜ Lock μ‚¬μš©
μ΄λŸ¬ν•œ ꡬ쑰λ₯Ό 톡해 λ„€νŠΈμ›Œν¬ μž‘μ—…μ΄ UI의 λ°˜μ‘μ„±μ— 영ν–₯을 μ£Όμ§€ μ•ŠμœΌλ©΄μ„œ 효율적인 데이터 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.