多线程知识

简介: 多线程知识

1.线程的创建


(1)线程的创建方式一:继承Thread类

/*
* 1.定义一个任务类,实现Runnable接口
 */
public class MyThread extends Thread{
    // 重写runnable的run方法
    @Override
    public void run() {
        for (int i = 0; i <=10 ; i++) {
            System.out.println("MyThread线程输出"+i);
        }
 
    }
}
public class ThreadTest1 {
    // main方法是由一条默认的主线程负责执行
    public static void main(String[] args) {
      // 3.创建MyThread线程类的对象代表一个线程
        Thread t=new MyThread();
 
        // 4.启动线程(自动执行run方法的)
        t.start();// main线程 t线程
 
        for (int i = 0; i <=10 ; i++) {
            System.out.println("主线程main输出"+i);
        }
    }
}

(2)线程的创建方式二:实现Runnable接口

1.定义一个多线程任务类MyRunnable实现Runnable接口,重写run()方法

2.创建一个Runnable任务对象

3.把MyRunnable任务对象交给Thread处理

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i <=5 ; i++) {
            System.out.println("子线程输出"+i);
        }
    }
}
public class ThreadTest2 {
    public static void main(String[] args) {
        // 3.创建任务对象
        Runnable target=new MyRunnable();
 
        // 4.把任务对象交给一个线程对象处理
        new Thread(target).start();
 
        for (int i = 0; i <=10 ; i++) {
            System.out.println("主线程main输出"+i);
        }
 
 
    }
 
}

(3)线程的创建方式三:利用Callable接口,FutureTask类来实现

1.创建任务对象 定义一个类实现Callable接口,重写call方法,封装要做的事情,和要返回的数据 把Callable类型的对象封装成FutureTask(线程任务对象)


2.把线程任务对象交给Thread对象


3.调用Thread对象的start方法启动线程


4.线程执行完毕后,通过FutureTask对象的get方法去获取线程任务执行的结果

import java.util.concurrent.Callable;
 
public class MyCallable implements Callable<String> {
    private int n;
 
    public MyCallable(int n) {
        this.n = n;
    }
 
    @Override
    public String call() throws Exception {
 
        // 描述线程的任务
        // 需求: 求1-n的和
        int sum=0;
        for (int i = 1; i <=n ; i++) {
            sum+=i;
        }
        return "线程求出了1-"+n+"的和是"+sum;
    }
}
public class ThreadTest3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 3.创建一个Callable的对象
        Callable <String> call=new MyCallable(100);
        // 4.把Callable的对象封装成一个FutureTask对象(任务对象)
        // 未来任务对象的作用?
        // 1.是一个任务对象,实现了Runnable对象
        // 2.可以在线程执行完毕后,用未来任务对象调用get方法获取线程执行完毕后的结果
        FutureTask <String> f1=new FutureTask<>(call);
 
        // 5.  把任务对象交给一个Thread对象
        new Thread(f1).start();
 
        // 6.获取线程执行完毕后返回的结果
        String rs= f1.get();
        System.out.println(rs);
 
    }
}

2.三种创建线程的优缺点:


1.继承Thread类

优点:代码简洁


缺点:由于是单继承,已经继承了Thread类,就无法继承其他类,拓展性差,功能不足;重写的run方法不能直接返回结果


2.实现Runnable接口

优点:可以实现其它接口,和继承父类,拓展性强


缺点:重写的run方法不能直接返回结果


3.利用Callable接口,FutureTask类来实现

优点:可以返回结果,拓展性强


缺点:代码较繁琐


目录
相关文章
|
缓存 并行计算 C++
实践教程|旋转目标检测模型-TensorRT 部署(C++)
实践教程|旋转目标检测模型-TensorRT 部署(C++)
371 0
|
监控 安全 Java
探索Java的未来:JDK 18新特性全览
探索Java的未来:JDK 18新特性全览
405 0
|
存储 网络协议 数据库
【计算机网络】第四章:网络层 (万字详解)
要让事情改变,先改变我自己;要让事情变得更好,先让自己变得更好。
【计算机网络】第四章:网络层 (万字详解)
|
缓存 Rust NoSQL
Higress 基于自定义插件访问 Redis
本文介绍了Higress,一个支持基于WebAssembly (WASM) 的边缘计算网关,它允许用户使用Go、C++或Rust编写插件来扩展其功能。文章特别讨论了如何利用Redis插件实现限流、缓存和会话管理等高级功能。
153731 115
|
10月前
|
机器学习/深度学习 算法 数据处理
SVM的优缺点是什么
SVM的优缺点是什么
592 9
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的网络游戏交易平台信息管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的网络游戏交易平台信息管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
157 0
|
缓存 人工智能 算法
编写高效的Python脚本:性能优化的策略与技巧
编写高效的Python脚本需要综合考虑多个方面,包括代码结构、数据结构和算法选择等。本文将探讨在Python编程中提高脚本性能的方法,包括优化数据结构、选择合适的算法、使用Python内置函数以及通过并行和异步编程提升效率。这些技巧旨在帮助开发者在不同应用场景中编写出高性能的Python代码。
|
JavaScript 前端开发 编译器
TypeScript的编译器、编辑器支持与工具链:构建高效开发环境的秘密武器
【4月更文挑战第23天】TypeScript的强大力量源于其编译器、编辑器支持和工具链,它们打造了高效的开发环境。编译器`tsc`进行类型检查、语法分析和代码转换;编辑器如VS Code提供智能提示、错误检查和格式化;工具链包括Webpack、Rollup等构建工具,Jest、Mocha等测试框架,以及代码质量和性能分析工具。这些组合使用能提升开发效率、保证代码质量和优化项目性能。
|
JSON 搜索推荐 API
API商品接口实现盈利
在当今的数字化时代,电子商务应用程序已经成为人们日常生活的重要组成部分。为了满足用户对于便捷购物体验的需求,许多电商平台提供了API商品接口,允许开发者调用特定的功能,如商品查询、购物车管理、订单处理以及支付等。然而,如何通过这些API商品接口实现盈利,是许多电商平台和开发者共同面临的问题。本文将探讨API商品接口实现盈利的几种方式。
|
前端开发 安全 Java
一文弄懂spring validate(上)
一文弄懂spring validate(上)
1354 0