温馨提示×

CentOS Java多线程编程指南

小樊
41
2025-08-14 13:34:02
栏目: 编程语言

CentOS Java多线程编程指南

一、环境准备

  1. 安装JDK

    sudo yum install java-1.8.0-openjdk-devel  # 安装JDK 8(推荐)  
    java -version  # 验证安装  
    
  2. 开发工具

    • 使用文本编辑器(如vim)或IDE(如IntelliJ IDEA)编写代码。

二、多线程实现方式

  1. 继承Thread类

    class MyThread extends Thread {  
        @Override  
        public void run() {  
            System.out.println("线程执行:" + Thread.currentThread().getName());  
        }  
    }  
    public class Main {  
        public static void main(String[] args) {  
            MyThread thread = new MyThread();  
            thread.start();  // 启动线程  
        }  
    }  
    
  2. 实现Runnable接口

    class MyRunnable implements Runnable {  
        @Override  
        public void run() {  
            System.out.println("线程执行:" + Thread.currentThread().getName());  
        }  
    }  
    public class Main {  
        public static void main(String[] args) {  
            Thread thread = new Thread(new MyRunnable());  
            thread.start();  
        }  
    }  
    
  3. 使用Callable和Future(带返回值)

    import java.util.concurrent.*;  
    class MyCallable implements Callable<Integer> {  
        @Override  
        public Integer call() {  
            return 42;  
        }  
    }  
    public class Main {  
        public static void main(String[] args) throws Exception {  
            ExecutorService executor = Executors.newSingleThreadExecutor();  
            Future<Integer> future = executor.submit(new MyCallable());  
            System.out.println("结果:" + future.get());  
            executor.shutdown();  
        }  
    }  
    

三、核心概念与技巧

  1. 线程状态

    • 新建(New):创建线程对象。
    • 就绪(Runnable):调用start()后等待CPU调度。
    • 运行(Running):执行run()方法。
    • 阻塞(Blocked/Waiting):因锁或wait()暂停。
    • 终止(Terminated):执行结束。
  2. 线程同步

    • synchronized关键字:同步代码块或方法,防止资源竞争。
      synchronized (lock) {  
          // 临界区代码  
      }  
      
    • Lock接口:提供更灵活的锁机制(如ReentrantLock)。
      Lock lock = new ReentrantLock();  
      lock.lock();  
      try {  
          // 临界区代码  
      } finally {  
          lock.unlock();  
      }  
      
  3. 线程池

    • 使用ExecutorService管理线程,避免频繁创建/销毁线程。
      ExecutorService executor = Executors.newFixedThreadPool(5);  // 固定大小线程池  
      executor.submit(() -> System.out.println("任务执行"));  
      executor.shutdown();  
      

四、常见问题与解决方案

  1. 死锁

    • 避免循环等待:按固定顺序获取锁,或使用超时机制。
    • 检测工具:通过jstack或VisualVM分析线程状态。
  2. 性能优化

    • 减少锁粒度:缩小同步代码块范围,使用读写锁(ReentrantReadWriteLock)提升并发读性能。
    • 避免Thread.sleep()滥用,优先使用wait/notifyCondition
  3. 线程安全集合

    • 使用ConcurrentHashMapCopyOnWriteArrayList等线程安全类,替代非线程安全的HashMapArrayList

五、调试与工具

  • 日志记录:通过System.out.println或日志框架(如Log4j)跟踪线程执行流程。
  • 调试工具
    • jstack:查看线程堆栈信息,定位死锁或阻塞问题。
    • VisualVM:监控线程状态、CPU和内存使用情况。

六、进阶技术

  • 并发工具类
    • CountDownLatch:等待多个线程完成任务。
    • Semaphore:控制同时访问资源的线程数量。
  • Fork/Join框架:适合分治任务(如大规模数据并行处理)。

参考资料

0