前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java多线程

Java多线程

原创
作者头像
奇怪的Java
发布2023-10-20 16:08:42
3840
发布2023-10-20 16:08:42
举报
文章被收录于专栏:随心写Java

Java多线程

多线程是指同时执行多个线程的能力。Java提供了内置的多线程支持,使得开发者可以轻松地创建和管理多个并发执行的线程

多线程

Process

Process(进程)是指正在运行的一个程序实例;Java提供了Process类,用于创建和控制外部进程

Thread

Thread(线程)是指执行线程任务的单个执行单元;Java提供了Thread类,用于创建和管理线程

线程创建方式

继承Thread类

开发者可以创建一个继承自Thread类的子类,并重写其run()方法来定义线程的执行逻辑;然后通过创建该子类的实例,调用start()方法来启动线程

代码语言:java
复制
class MyThread extends Thread {
    public void run() {
        // 线程执行的逻辑
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动线程
    }
}

实现Runnable接口

开发者可以创建一个实现了Runnable接口的类,并实现其run()方法来定义线程的执行逻辑;然后通过创建该类的实例,将其作为参数传递给Thread类的构造函数,最后调用start()方法来启动线程

代码语言:java
复制
class MyRunnable implements Runnable {
    public void run() {
        // 线程执行的逻辑
    }
}

public class Main {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start(); // 启动线程
    }
}

实现Callable接口

Callable接口代表一个可以在当前线程中执行的代码块,但它可以返回结果;因此,Runnable接口适用于那些不需要返回结果的操作,而Callable接口适用于那些需要返回结果的操作

代码语言:java
复制
class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        // 在这里编写你的逻辑代码
        // 返回你的结果
        return 42;
    }
}


public class Main {
    public static void main(String[] args) throws Exception {
        // 创建一个线程池
        ExecutorService executorService = Executors.newSingleThreadExecutor();

        // 创建一个Callable任务
        Callable<Integer> callable = new MyCallable();

        // 提交任务并获得一个Future对象
        Future<Integer> future = executorService.submit(callable);

        // 等待任务执行完成并获取结果
        Integer result = future.get();

        // 输出结果
        System.out.println("Result: " + result);

        // 关闭线程池
        executorService.shutdown();
    }
}

代理模式

Java的代理模式是一种结构型设计模式,它允许在不改变现有代码的情况下,为对象提供一个代理,以控制对该对象的访问。代理模式可以用于实现对象的“守卫”或“代理”,可以在运行时对对象的行为进行修改或增强

  • 抽象角色:代理角色和真实角色对外提供的公共方法,常是一个抽象数据类型或接口
  • 真实角色:需要实现抽象角色接口,定义真正所要实现的业务逻辑,以便代理角色调用
  • 代理角色:需要实现抽象角色接口,真实角色的代理,通过真实角色的业务逻辑来实现抽象方法,并可以附加自己的操作,将统一的流程控制都放到代理角色中处理

动态代理

动态代理是通过实现java.lang.reflect.Proxy接口来创建代理对象,代理对象可以在运行时动态地生成;动态代理通常用于实现AOP(面向切面编程)等场景

静态代理

静态代理(Static Proxy)是一种通过编写代码来拦截并修改对象行为的技术;静态代理使用Java字节码操作,可以在运行时生成代理类,对代理对象进行增强;静态代理主要使用Java反射机制实现

代码语言:java
复制
//抽象角色(手机厂家)
public interface PhoneFactory {
    void deliverGoods();
}

//真实角色
public class Xiaomi implements PhoneFactory {
    @Override
    public void deliverGoods() {
        System.out.println("小米手机....发货了");
    }
}

//真实角色
public class Huawei implements PhoneFactory {
    @Override
    public void deliverGoods() {
        System.out.println("华为手机....发货了");
    }
}

//代理角色
public class JD implements PhoneFactory {
    private PhoneFactory factory;

    public JD(PhoneFactory factory) {
        this.factory = factory;
    }

    private void sailBefore() {
        System.out.println("售前服务");
    }

    private void sailAfter() {
        System.out.println("售后服务");
    }

    //对真实角色的行为(方法)进行增强
    @Override
    public void deliverGoods() {
        sailBefore();
        factory.deliverGoods();
        sailAfter();
    }
}

//调用者
public class ShoppingTest {
    public static void main(String[] args) {
        PhoneFactory haier = new Huawei();
        JD jd = new JD(haier);
        jd.deliverGoods();
    }
}


//拓展需求,购买OPPO手机
public class OPPO implements PhoneFactory{
    @Override
    public void deliverGoods() {
        System.out.println("OPPO手机....发货了");
    }
}
 
 
 
//调用者
public class ShoppingTest {
    public static void main(String[] args) {
        Factory oppo = new OPPO();
        JD jd = new JD(oppo);
        jd.deliverGoods();
    }
}

线程方法

线程生命周期

多线程适用场景

1、并发处理: 如果需要同时处理多个任务或请求,可以使用线程来并发执行这些任务。在 Java 中,可以使用 Thread 类或实现 Runnable 接口创建线程,并通过 start() 方法启动线程 异步操作: 在某些情况下,需要进行异步操作,例如处理耗时的操作、IO 操作或网络请求。使用线程可以在后台执行这些操作,而不会阻塞主线程。在 Java 中,可以使用 ExecutorService、CompletableFuture、FutureTask 等来实现异步操作

2、定时任务: 需要按照一定的时间间隔或时间表执行任务,可以使用线程来执行定时任务。在 Java 中,可以使用 Timer、ScheduledExecutorService 或第三方库如 Quartz 来执行定时任务 并行计算: 在需要并行计算的场景中,可以使用线程来同时执行计算任务,从而加速处理速度。在 Java 中,可以使用 ExecutorService、ForkJoinPool 等来实现并行计算。

3、多线程数据处理: 如果有大量的数据需要处理,可以使用多线程来并行处理数据。例如,将数据分割成多个部分,每个线程处理一个部分,并将结果合并。在 Java 中,可以使用 ExecutorService、ForkJoinPool、并发集合类等来实现多线程数据处理 4、线程池: 在需要管理线程的创建、复用和销毁时,可以使用线程池来提高性能和资源利用率。线程池可以预先创建一组线程,并维护一个任务队列,以便在需要时执行任务。在 Java 中,可以使用 ExecutorService、ThreadPoolExecutor 来创建和管理线程池

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java多线程
  • 多线程
    • Process
      • Thread
      • 线程创建方式
        • 继承Thread类
          • 实现Runnable接口
            • 实现Callable接口
              • 代理模式
                • 动态代理
                  • 静态代理
                    • 线程方法
                      • 线程生命周期
                        • 多线程适用场景
                        相关产品与服务
                        GPU 云服务器
                        GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于生成式AI,自动驾驶,深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档