Java多线程

Java多线程是Java编程中的一个重要特性,它允许程序同时执行多个任务。这不仅可以提高程序的执行效率,还能更好地利用现代多核处理器的计算能力。在Java中,创建多线程主要有以下几种方式:

1. 继承Thread

通过继承java.lang.Thread类并重写其run()方法,可以创建新的线程。然后,可以创建该类的实例并调用其start()方法来启动新线程。

class MyThread extends Thread {  
    public void run() {  
        System.out.println("Thread running");  
    }  
  
    public static void main(String[] args) {  
        MyThread t = new MyThread();  
        t.start(); // 启动线程  
    }  
}

2. 实现Runnable接口

实现java.lang.Runnable接口并实现其run()方法,然后将该实现类的实例传递给Thread类的构造器来创建线程。这种方式比继承Thread类更灵活,因为Java不支持多重继承,但可以实现多个接口。

class MyRunnable implements Runnable {  
    public void run() {  
        System.out.println("Thread running");  
    }  
  
    public static void main(String[] args) {  
        Thread t = new Thread(new MyRunnable());  
        t.start(); // 启动线程  
    }  
}

3. 使用CallableFuture

Callable接口类似于Runnable,但它可以返回一个结果,并且可以声明抛出的异常。Future用于表示异步计算的结果,它提供了检查计算是否完成、等待计算完成以及检索计算结果的方法。FutureTaskFuture的一个实现,同时实现了Runnable接口,因此可以作为Thread的目标来执行。

import java.util.concurrent.*;  
  
class MyCallable implements Callable<Integer> {  
    public Integer call() throws Exception {  
        return 123;  
    }  
  
    public static void main(String[] args) throws ExecutionException, InterruptedException {  
        ExecutorService executor = Executors.newCachedThreadPool();  
        Future<Integer> future = executor.submit(new MyCallable());  
  
        System.out.println(future.get()); // 阻塞等待直到计算完成,并返回结果  
  
        executor.shutdown();  
    }  
}

4. 使用线程池

线程池(如ExecutorService)是管理一组线程的集合,它提供了控制并发数量的能力,并且可以有效地重用线程,从而减少线程创建和销毁的开销。

ExecutorService executor = Executors.newFixedThreadPool(5); // 创建一个固定大小的线程池  
for (int i = 0; i < 10; i++) {  
    Runnable worker = new WorkerThread("" + i);  
    executor.execute(worker);  
}  
executor.shutdown(); // 不再提交任何任务,关闭线程池  
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); // 等待所有任务完成

注意事项

  • 线程安全:多线程环境下,需要确保对共享数据的访问是线程安全的。
  • 同步和锁:Java提供了多种同步机制(如synchronized关键字、ReentrantLock等)来控制多个线程对共享资源的访问。
  • 死锁:在多个线程相互等待对方释放锁时可能会发生死锁,需要避免。
  • 性能考量:过多的线程会消耗大量的系统资源,并且可能导致上下文切换的开销增加,从而影响性能。需要根据实际情况调整线程的数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值