找回密码
 立即注册
查看: 658|回复: 0

[linux] Java多线程与并发编程

[复制链接]

191

主题

3

回帖

656

积分

高级会员

积分
656
发表于 2024-6-13 20:56:29 | 显示全部楼层 |阅读模式



引言
多线程和并发编程是java的强大特性之一,它使得开发者能够编写高效的、响应迅速的应用程序。然而,多线程编程也带来了复杂性,如线程同步和资源竞争问题。本文将介绍Java多线程与并发编程的基础知识、常见问题及解决方案,帮助你更好地理解和应用这些技术。

多线程的基础知识

1. 线程与进程:
    进程:操作系统中独立运行的程序,每个进程有自己的内存空间。
    线程:进程中的一个执行路径,多个线程共享进程的内存空间。

2. 创建线程的方式:
    继承Thread类:
     ```java
     class MyThread extends Thread {
         public void run() {
             System.out.println("Thread is running");
         }
     }

     public class Main {
         public static void main(String[] args) {
             MyThread t1 = new MyThread();
             t1.start();
         }
     }
     ```
    实现Runnable接口:
     ```java
     class MyRunnable implements Runnable {
         public void run() {
             System.out.println("Thread is running");
         }
     }

     public class Main {
         public static void main(String[] args) {
             Thread t1 = new Thread(new MyRunnable());
             t1.start();
         }
     }
     ```

3. 线程的生命周期:
    新建(New):线程对象被创建。
    就绪(Runnable):线程准备运行,等待CPU时间片。
    运行(Running):线程正在执行。
    阻塞(Blocked):线程被阻塞,等待资源。
    终止(Terminated):线程执行完毕。

线程同步与通信

1. 同步机制:
    synchronized关键字:确保同一时刻只有一个线程执行代码块。
     ```java
     class Counter {
         private int count = 0;

         public synchronized void increment() {
             count++;
         }

         public int getCount() {
             return count;
         }
     }
     ```

2. 锁机制:
    ReentrantLock:提供了比synchronized更高级的功能。
     ```java
     import java.util.concurrent.locks.ReentrantLock;

     class Counter {
         private int count = 0;
         private final ReentrantLock lock = new ReentrantLock();

         public void increment() {
             lock.lock();
             try {
                 count++;
             } finally {
                 lock.unlock();
             }
         }

         public int getCount() {
             return count;
         }
     }
     ```

3. 线程通信:
    wait()、notify()、notifyAll():用于线程间通信。
     ```java
     class SharedResource {
         private boolean flag = false;

         public synchronized void waitForCondition() throws InterruptedException {
             while (!flag) {
                 wait();
             }
         }

         public synchronized void changeCondition() {
             flag = true;
             notifyAll();
         }
     }
     ```

并发工具类

1. Executor框架:
    ThreadPoolExecutor:线程池管理多个线程。
     ```java
     import java.util.concurrent.ExecutorService;
     import java.util.concurrent.Executors;

     public class Main {
         public static void main(String[] args) {
             ExecutorService executor = Executors.newFixedThreadPool(5);

             for (int i = 0; i < 10; i++) {
                 executor.execute(new RunnableTask());
             }

             executor.shutdown();
         }
     }
     ```

2. 并发集合:
    ConcurrentHashMap:线程安全的哈希表。
     ```java
     import java.util.concurrent.ConcurrentHashMap;

     public class Main {
         public static void main(String[] args) {
             ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
             map.put("key", 1);
             System.out.println(map.get("key"));
         }
     }
     ```

3. CountDownLatch:
    允许一个或多个线程等待一组操作完成。
     ```java
     import java.util.concurrent.CountDownLatch;

     public class Main {
         public static void main(String[] args) throws InterruptedException {
             CountDownLatch latch = new CountDownLatch(3);

             for (int i = 0; i < 3; i++) {
                 new Thread(() > {
                     System.out.println("Task executed");
                     latch.countDown();
                 }).start();
             }

             latch.await();
             System.out.println("All tasks completed");
         }
     }
     ```

4. CyclicBarrier:
    允许一组线程相互等待,直到所有线程都到达一个公共的屏障点。
     ```java
     import java.util.concurrent.BrokenBarrierException;
     import java.util.concurrent.CyclicBarrier;

     public class Main {
         public static void main(String[] args) {
             int parties = 3;
             CyclicBarrier barrier = new CyclicBarrier(parties, () > {
                 System.out.println("All parties arrived at barrier");
             });

             for (int i = 0; i < parties; i++) {
                 new Thread(() > {
                     System.out.println("Thread reached barrier");
                     try {
                         barrier.await();
                     } catch (InterruptedException | BrokenBarrierException e) {
                         e.printStackTrace();
                     }
                 }).start();
             }
         }
     }
     ```

常见问题与解决方案

1. 死锁:
    两个或多个线程相互等待对方释放锁,从而永远等待下去。
    解决方案:避免嵌套锁、使用tryLock()等。

2. 活锁:
    线程不断改变状态却无法推进。
    解决方案:引入随机等待时间。

3. 线程饥饿:
    低优先级线程长期得不到执行机会。
    解决方案:合理设置线程优先级、避免过多锁竞争。

结论
Java多线程与并发编程是开发高性能应用的重要技术。通过理解线程的基本概念、掌握同步和通信机制、利用并发工具类,可以有效地编写并发程序,提升应用的响应速度和处理能力。



广告

需要高性能、稳定可靠的免实名服务器?欢迎联系TG:@IDCzhanglang了解更多详情。我们提供优质的服务器资源,助力您的业务发展。



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-5 02:25 , Processed in 0.060499 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表