基础线程知识

线程

1、什么是线程?
线程是CPU执行任务的最小单元,也是程序内部的一条执行路径。
我们之前启动程序后,main方法执行其实就是一条单独的执行路径,程序中如果只有一条执行路径的话,那么他就是单线程的程序。
public static void main(String[] args) {
Student stu = new Student();
    stu.setAge(99);
        stu.setHeight(1000);
}
2、多线程是什么?
多线程就是从软硬件上实现多条执行流程的技术。
3、java是通过java.lang.Thread类来代表线程的,按照面向对象的思想,Thread类提供了实现多线程的方式。
4、线程的创建方式
多线程的实现方案一:继承Thread类
(1)定义一个子类MyThread继承线程类java.lang.Thread,重写Run()方法;
(2)创建MyThread类的对象;
(3)调用对象的start()方法启动线程;

优点:编码简单

缺点:线程已经继承Thread,无法继承其他类,不利于扩展。

多线程的实现方案二:
(1)定义一个任务类MyRunnable实现Runnable接口,重写run()方法;
(2)创建Runnable任务对象;
(3)把Runnable任务对象交给Thread处理;
(4)调用线程的Start()方法启动线程;

优点:扩展性强

缺点:线程有执行结果的话是不可以返回的

多线程的实现方案三:
利用Runnable匿名内部类方式;

代码演示

package com.DarkHorse;
​
public class Main3 {
​
    public static void main(String[] args) {
        Runnable target = new Runnable() {
​
            @Override
            public void run() {
                for(int i=0;i<100;i++) {
                    System.out.println("子线程执行输出"+i);
                }
            }
        };
        Thread s=new Thread(target);
        new Thread(new Runnable() {
​
            @Override
            public void run() {
                for(int i=0;i<100;i++) {
                    System.out.println("子线程执行输出"+i);
                }
            }
        }).start();
        for(int i =0;i<100;i++) {
            System.out.println("第三个线程执行");
        }
​
            new Thread(()->{
                for(int i =0;i<100;i++) {
                    System.out.println("线程和运行"+i);
                }
            }).start();
}
}
多线程的实现方案四:
利用Callable、FutureTask接口实现得到任务对象
(1)定义类实现Callable接口,重写call方法,封装要做的事情
(2)用FutureTask把Callable对象封装成线程任务对象。
把线程任务对象交给Thread处理
调用Thread的start方法启动线程,执行任务
线程执行完毕后、通过FutureTask的get方法去获取任务执行的结果。
利用Callable、FutureTask接口实现。
优点:扩展性强,可以得到线程执行的结果。

代码演示

 package com.DarkHorse;
​
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 {
        int sum = 0;
        for(int i=1;i<n;i++) {
            sum+=i;
        }
​
        return "子线程执行的结果是:"+sum;
    }
​
}
//
 package com.DarkHorse;
​
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
​
public class Main4 {
​
    public static void main(String[] args) {
        Callable<String> call=new MyCallable(100);
        FutureTask<String> f1=new FutureTask<>(call);
        Thread f2=new Thread(f1);
        f2.start();
        Callable<String> call2=new MyCallable(200);
        FutureTask<String> f4=new FutureTask<>(call2);
        Thread f3=new Thread(f4);
        f3.start();
        try {
            //如果f1没有执行完毕的话,这里的代码会等待,直到跑完才提取结果
            String rs1=f1.get();
            System.out.println("第一个结果是:"+rs1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        try {
            String rs2=f4.get();
            System.out.println("第二个结果是:"+rs2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}
5、为什么不是直接调用run()方法而是调用start启动线程呢?
直接调用run()方法的话就会当成普通方法执行,就是把主线程任务放在子线程之前了,就不是多线程了,只有调用start启动线程才行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值