多线程

本文展示了三种在Java中创建线程的方法:实现Runnable接口、继承Thread类以及使用Callable和Future。通过示例代码,可以看到不同创建方式下的线程执行顺序和交互效果,强调了线程并发和返回值处理的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、实现Runnable接口创建线程

public class RunnableDemo implements Runnable{
    private Thread t;
    private String threadName;

    public RunnableDemo(String threadName){
        this.threadName=threadName;
        System.out.println("Creating + "+threadName);
    }

    @Override
    public void run() {
        System.out.println("Running + "+threadName);
        try {
            for (int i=4;i>0;i--){
                System.out.println("Thread + "+threadName+","+i);
                Thread.sleep(50);
            }
        }catch (InterruptedException e){
            System.out.println("Thread + "+threadName+"interrupted.");
        }
        System.out.println("Thread +"+threadName+"exiting.");
    }

    public void start(){
        System.out.println("Starting +"+threadName);
        if (t==null){
            t=new Thread(this,threadName);
            t.start();
        }
    }
}

public class TestThread {

    public static void main(String[] args) {
        RunnableDemo r1=new RunnableDemo("Thread-1");
        r1.start();

        RunnableDemo r2=new RunnableDemo("Thread-2");
        r2.start();
    }
}

输出结果:

Creating + Thread-1
Starting +Thread-1
Creating + Thread-2
Starting +Thread-2
Running + Thread-1
Thread + Thread-1,4
Running + Thread-2
Thread + Thread-2,4
Thread + Thread-1,3
Thread + Thread-2,3
Thread + Thread-1,2
Thread + Thread-2,2
Thread + Thread-1,1
Thread +Thread-1exiting.
Thread + Thread-2,1
Thread +Thread-2exiting.

2、继承Thread类创建线程

public class ThreadDemo extends Thread{
    private Thread t;
    private String threadName;

    public ThreadDemo(String threadName){
        this.threadName=threadName;
        System.out.println("Creating + "+threadName);
    }
    @Override
    public void run(){
        System.out.println("Running + "+threadName);
        try {
            for (int i=4;i>0;i--){
                System.out.println("Thread + "+threadName+","+i);
                Thread.sleep(50);
            }
        }catch (Exception e){
            System.out.println("Thread + "+threadName+" interrupter.");
        }
        System.out.println("Thread + "+threadName+" exiting.");
    }

    public void start(){
        System.out.println("Starting + "+threadName);
        if (t==null){
            t=new Thread(this,threadName);
            t.start();
        }
    }
}


public class TestThread {

    public static void main(String[] args) {
        ThreadDemo t1=new ThreadDemo("Thread-1");
        t1.start();

        ThreadDemo t2=new ThreadDemo("Thread-2");
        t2.start();
    }
}

输出结果:

Creating + Thread-1
Starting + Thread-1
Creating + Thread-2
Starting + Thread-2
Running + Thread-2
Thread + Thread-2,4
Running + Thread-1
Thread + Thread-1,4
Thread + Thread-2,3
Thread + Thread-1,3
Thread + Thread-2,2
Thread + Thread-1,2
Thread + Thread-2,1
Thread + Thread-1,1
Thread + Thread-2 exiting.
Thread + Thread-1 exiting.

3、通过 Callable 和 Future 创建线程

public class CallableThreadTest implements Callable<Integer> {

    @Override
    public Integer call() throws Exception{
        int i=0;
        for (;i<100;i++){
            System.out.println(Thread.currentThread().getName()+" "+i);
        }
        return i;
    }
    public static void main(String[] args) {
        CallableThreadTest ctt=new CallableThreadTest();
        FutureTask<Integer> ft=new FutureTask<Integer>(ctt);
        for (int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i);
            if (i==20){
                new Thread(ft,"有返回值的线程").start();
            }
        }
        try {
            System.out.println("子线程的返回值:"+ft.get());
        }catch (InterruptedException e){
            e.printStackTrace();
        }catch (ExecutionException e){
            e.printStackTrace();
        }
    }
}

输出结果:

main 的循环变量i的值0
main 的循环变量i的值1
main 的循环变量i的值2
main 的循环变量i的值3
main 的循环变量i的值4
main 的循环变量i的值5
main 的循环变量i的值6
main 的循环变量i的值7
main 的循环变量i的值8
main 的循环变量i的值9
main 的循环变量i的值10
main 的循环变量i的值11
main 的循环变量i的值12
main 的循环变量i的值13
main 的循环变量i的值14
main 的循环变量i的值15
main 的循环变量i的值16
main 的循环变量i的值17
main 的循环变量i的值18
main 的循环变量i的值19
main 的循环变量i的值20
main 的循环变量i的值21
main 的循环变量i的值22
main 的循环变量i的值23
main 的循环变量i的值24
main 的循环变量i的值25
main 的循环变量i的值26
main 的循环变量i的值27
main 的循环变量i的值28
main 的循环变量i的值29
main 的循环变量i的值30
main 的循环变量i的值31
main 的循环变量i的值32
main 的循环变量i的值33
main 的循环变量i的值34
main 的循环变量i的值35
main 的循环变量i的值36
main 的循环变量i的值37
main 的循环变量i的值38
main 的循环变量i的值39
main 的循环变量i的值40
main 的循环变量i的值41
main 的循环变量i的值42
main 的循环变量i的值43
main 的循环变量i的值44
main 的循环变量i的值45
main 的循环变量i的值46
main 的循环变量i的值47
main 的循环变量i的值48
main 的循环变量i的值49
main 的循环变量i的值50
main 的循环变量i的值51
main 的循环变量i的值52
main 的循环变量i的值53
main 的循环变量i的值54
main 的循环变量i的值55
main 的循环变量i的值56
有返回值的线程 0
有返回值的线程 1
有返回值的线程 2
有返回值的线程 3
有返回值的线程 4
有返回值的线程 5
有返回值的线程 6
有返回值的线程 7
有返回值的线程 8
有返回值的线程 9
有返回值的线程 10
有返回值的线程 11
有返回值的线程 12
有返回值的线程 13
有返回值的线程 14
有返回值的线程 15
有返回值的线程 16
有返回值的线程 17
有返回值的线程 18
有返回值的线程 19
有返回值的线程 20
有返回值的线程 21
有返回值的线程 22
有返回值的线程 23
有返回值的线程 24
有返回值的线程 25
有返回值的线程 26
有返回值的线程 27
有返回值的线程 28
有返回值的线程 29
有返回值的线程 30
有返回值的线程 31
main 的循环变量i的值57
有返回值的线程 32
main 的循环变量i的值58
有返回值的线程 33
main 的循环变量i的值59
有返回值的线程 34
有返回值的线程 35
有返回值的线程 36
有返回值的线程 37
有返回值的线程 38
有返回值的线程 39
有返回值的线程 40
有返回值的线程 41
有返回值的线程 42
有返回值的线程 43
有返回值的线程 44
有返回值的线程 45
有返回值的线程 46
有返回值的线程 47
有返回值的线程 48
有返回值的线程 49
有返回值的线程 50
有返回值的线程 51
有返回值的线程 52
有返回值的线程 53
有返回值的线程 54
有返回值的线程 55
有返回值的线程 56
有返回值的线程 57
有返回值的线程 58
有返回值的线程 59
有返回值的线程 60
有返回值的线程 61
有返回值的线程 62
有返回值的线程 63
有返回值的线程 64
有返回值的线程 65
有返回值的线程 66
有返回值的线程 67
有返回值的线程 68
有返回值的线程 69
有返回值的线程 70
有返回值的线程 71
有返回值的线程 72
有返回值的线程 73
有返回值的线程 74
有返回值的线程 75
有返回值的线程 76
有返回值的线程 77
有返回值的线程 78
有返回值的线程 79
有返回值的线程 80
有返回值的线程 81
有返回值的线程 82
有返回值的线程 83
有返回值的线程 84
有返回值的线程 85
main 的循环变量i的值60
main 的循环变量i的值61
main 的循环变量i的值62
main 的循环变量i的值63
main 的循环变量i的值64
main 的循环变量i的值65
main 的循环变量i的值66
main 的循环变量i的值67
main 的循环变量i的值68
main 的循环变量i的值69
main 的循环变量i的值70
main 的循环变量i的值71
main 的循环变量i的值72
main 的循环变量i的值73
main 的循环变量i的值74
main 的循环变量i的值75
main 的循环变量i的值76
main 的循环变量i的值77
main 的循环变量i的值78
main 的循环变量i的值79
main 的循环变量i的值80
main 的循环变量i的值81
main 的循环变量i的值82
main 的循环变量i的值83
main 的循环变量i的值84
main 的循环变量i的值85
main 的循环变量i的值86
main 的循环变量i的值87
main 的循环变量i的值88
main 的循环变量i的值89
main 的循环变量i的值90
main 的循环变量i的值91
main 的循环变量i的值92
main 的循环变量i的值93
main 的循环变量i的值94
main 的循环变量i的值95
main 的循环变量i的值96
main 的循环变量i的值97
main 的循环变量i的值98
main 的循环变量i的值99
有返回值的线程 86
有返回值的线程 87
有返回值的线程 88
有返回值的线程 89
有返回值的线程 90
有返回值的线程 91
有返回值的线程 92
有返回值的线程 93
有返回值的线程 94
有返回值的线程 95
有返回值的线程 96
有返回值的线程 97
有返回值的线程 98
有返回值的线程 99
子线程的返回值:100
标题“51单片机通过MPU6050-DMP获取姿态角例程”解析 “51单片机通过MPU6050-DMP获取姿态角例程”是一个基于51系列单片机(一种常见的8位微控制器)的程序示例,用于读取MPU6050传感器的数据,并通过其内置的数字运动处理器(DMP)计算设备的姿态角(如倾斜角度、旋转角度等)。MPU6050是一款集成三轴加速度计和三轴陀螺仪的六自由度传感器,广泛应用于运动控制和姿态检测领域。该例程利用MPU6050的DMP功能,由DMP处理复杂的运动学算法,例如姿态融合,将加速度计和陀螺仪的数据进行整合,从而提供稳定且实时的姿态估计,减轻主控MCU的计算负担。最终,姿态角数据通过LCD1602显示屏以字符形式可视化展示,为用户提供直观的反馈。 从标签“51单片机 6050”可知,该项目主要涉及51单片机和MPU6050传感器这两个关键硬件组件。51单片机基于8051内核,因编程简单、成本低而被广泛应用;MPU6050作为惯性测量单元(IMU),可测量设备的线性和角速度。文件名“51-DMP-NET”可能表示这是一个与51单片机及DMP相关的网络资源或代码库,其中可能包含C语言等适合51单片机的编程语言的源代码、配置文件、用户手册、示例程序,以及可能的调试工具或IDE项目文件。 实现该项目需以下步骤:首先是硬件连接,将51单片机与MPU6050通过I2C接口正确连接,同时将LCD1602连接到51单片机的串行数据线和控制线上;接着是初始化设置,配置51单片机的I/O端口,初始化I2C通信协议,设置MPU6050的工作模式和数据输出速率;然后是DMP配置,启用MPU6050的DMP功能,加载预编译的DMP固件,并设置DMP输出数据的中断;之后是数据读取,通过中断服务程序从DMP接收姿态角数据,数据通常以四元数或欧拉角形式呈现;再接着是数据显示,将姿态角数据转换为可读的度数格
MathorCup高校数学建模挑战赛是一项旨在提升学生数学应用、创新和团队协作能力的年度竞赛。参赛团队需在规定时间内解决实际问题,运用数学建模方法进行分析并提出解决方案。2021年第十一届比赛的D题就是一个典型例子。 MATLAB是解决这类问题的常用工具。它是一款强大的数值计算和编程软件,广泛应用于数学建模、数据分析和科学计算。MATLAB拥有丰富的函数库,涵盖线性代数、统计分析、优化算法、信号处理等多种数学操作,方便参赛者构建模型和实现算法。 在提供的文件列表中,有几个关键文件: d题论文(1).docx:这可能是参赛队伍对D题的解答报告,详细记录了他们对问题的理解、建模过程、求解方法和结果分析。 D_1.m、ratio.m、importfile.m、Untitled.m、changf.m、pailiezuhe.m、huitu.m:这些是MATLAB源代码文件,每个文件可能对应一个特定的计算步骤或功能。例如: D_1.m 可能是主要的建模代码; ratio.m 可能用于计算某种比例或比率; importfile.m 可能用于导入数据; Untitled.m 可能是未命名的脚本,包含临时或测试代码; changf.m 可能涉及函数变换; pailiezuhe.m 可能与矩阵的排列组合相关; huitu.m 可能用于绘制回路图或流程图。 matlab111.mat:这是一个MATLAB数据文件,存储了变量或矩阵等数据,可能用于后续计算或分析。 D-date.mat:这个文件可能包含与D题相关的特定日期数据,或是模拟过程中用到的时间序列数据。 从这些文件可以推测,参赛队伍可能利用MATLAB完成了数据预处理、模型构建、数值模拟和结果可视化等一系列工作。然而,具体的建模细节和解决方案需要查看解压后的文件内容才能深入了解。 在数学建模过程中,团队需深入理解问题本质,选择合适的数学模
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值