Java多线程学习

目录

1.什么是多线程?

2.并发与并行的概念

3.进程和线程

4.多线程的实现方式

1.继承Thread类

思考两个问题

为什么要重写run()方法?

run()方法和start()方法的区别?

2.实现Runnable接口

3.Callable和Future

 三种方式对比


1.什么是多线程?

多线程是指在一个程序中同时执行多个线程,每个线程可以独立完成特定的任务。多线程的概念基于并发性,即在同一时间段内,多个线程可以同时执行,从而提高程序的效率和响应速度。

2.并发与并行的概念

  • 并发:是指在同一个时间段内,多个任务交替执行的能力。在单核处理器上,由于CPU时间片轮转调度的机制,多个任务轮流获取CPU的执行时间,产生了并发的效果。在并发执行中,任务可能会互相切换执行,但不一定同时执行。 
  • 并行: 并行是指同时执行多个任务的能力。在多核处理器或分布式系统上,不同的任务可以同时在不同的处理器核心或不同的计算节点上独立执行,实现真正的并行处理。

3.进程和线程

进程:是在运行的软件

  • 独立性:进程是一个独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
  • 动态性:进程的实质是一次程序执行的过程,进程动态产生,动态消亡;
  • 并发性: 任何进程都可以同其他进程并发执行; 

线程:是进程中单个顺序控制流,是一条执行路径

  • 单线程:如果一个进程只有一条执行路径,则称为单线程程序;
  • 多线程:如果一个进程有多条执行路径,则称为多线程程序;

4.多线程的实现方式

1.继承Thread类

package Multithreading;

public class MyThread extends Thread{
    @Override
    public void run() {
        //线程开启之后执行的代码
        for (int i = 0; i < 100; i++) {
            System.out.println("线程开启了"+i);
        }
    }
}
class Demo{
    public static void main(String[] args) {
        MyThread t1 = new MyThread();//创建一个线程对象
        MyThread t2 = new MyThread();//创建一个线程对象
        t1.start();//开启第一条线程
        t2.start();//开启第二条线程
    }
}
//结果
线程开启了0
线程开启了1
线程开启了2
线程开启了3
线程开启了4
线程开启了5
线程开启了6
线程开启了7
线程开启了8
线程开启了9
线程开启了10
线程开启了11
线程开启了12
线程开启了13
线程开启了14
线程开启了15
线程开启了16
线程开启了17
线程开启了18
线程开启了19
线程开启了20
线程开启了21
线程开启了22
线程开启了23
线程开启了0
线程开启了24
线程开启了1
线程开启了2
线程开启了25
线程开启了3
线程开启了26
线程开启了27
线程开启了28
线程开启了29
线程开启了4
线程开启了30
线程开启了31
线程开启了5
线程开启了32
线程开启了33
线程开启了34
线程开启了35
线程开启了36
线程开启了37
线程开启了38
线程开启了39
线程开启了6
线程开启了7
线程开启了8
线程开启了9
线程开启了10
线程开启了40
线程开启了11
线程开启了41
线程开启了42
线程开启了43
线程开启了44
线程开启了12
线程开启了45
线程开启了46
线程开启了47
线程开启了48
线程开启了13
线程开启了14
线程开启了49
线程开启了15
线程开启了50
线程开启了16
线程开启了17
线程开启了18
线程开启了19
线程开启了20
线程开启了21
线程开启了22
线程开启了23
线程开启了24
线程开启了25
线程开启了26
线程开启了27
线程开启了28
线程开启了29
线程开启了30
线程开启了31
线程开启了32
线程开启了33
线程开启了34
线程开启了35
线程开启了36
线程开启了37
线程开启了38
线程开启了39
线程开启了40
线程开启了41
线程开启了42

实现了线程的并发性

思考两个问题

为什么要重写run()方法?

因为run()方法是用来封装被线程执行的代码,所以必须重写run()方法;

run()方法和start()方法的区别?

 run()方法:封装线程执行的代码,直接调用,相当于普通方法的调用,并没有开启线程.

start()方法:启动线程,然后右JVM调用此线程的run()方法. 

2.实现Runnable接口

package Multithreading;

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        //线程开启之后执行的代码
        for (int i = 0; i < 100; i++) {
            System.out.println("第二种方式实现多线程"+i);
        }
    }
}
//测试类
class Demo1{
    public static void main(String[] args) {
        //创建一个参数对象
        MyRunnable mr = new MyRunnable();
        //创建一个线程对象,并把线程传递给这个线程,
        //启动执行的就是参数对象里面的run()方法
        Thread t1 = new Thread(mr);
        //开启一个线程
        t1.start();

        MyRunnable mr2 = new MyRunnable();
        Thread t2 = new Thread(mr2);
        //开启第二个线程
        t2.start();
    }
}
//结果
第二种方式实现多线程0
第二种方式实现多线程1
第二种方式实现多线程0
第二种方式实现多线程1
第二种方式实现多线程2
第二种方式实现多线程3
第二种方式实现多线程2
第二种方式实现多线程4
第二种方式实现多线程3
第二种方式实现多线程4
第二种方式实现多线程5
第二种方式实现多线程5
第二种方式实现多线程6
第二种方式实现多线程7
第二种方式实现多线程6
第二种方式实现多线程8
第二种方式实现多线程9
第二种方式实现多线程7
第二种方式实现多线程10
第二种方式实现多线程11
第二种方式实现多线程12
第二种方式实现多线程8
第二种方式实现多线程13
第二种方式实现多线程14
第二种方式实现多线程15
第二种方式实现多线程9
第二种方式实现多线程10
第二种方式实现多线程16
第二种方式实现多线程17
第二种方式实现多线程18
第二种方式实现多线程19
第二种方式实现多线程20
第二种方式实现多线程11
第二种方式实现多线程21
第二种方式实现多线程22
第二种方式实现多线程23
第二种方式实现多线程24
第二种方式实现多线程25
第二种方式实现多线程26
第二种方式实现多线程27
第二种方式实现多线程28
第二种方式实现多线程29
第二种方式实现多线程30
第二种方式实现多线程31
第二种方式实现多线程32
第二种方式实现多线程33

实现了线程的并发性 

3.Callable和Future

package Multithreading;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        for (int i = 0; i < 100; i++) {
            System.out.println("跟女孩表白"+i+"次");
        }
        return "答应";
    }
}
//测试类
class Demo3{
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //线程开启之后需要执行里面的Call()方法
        MyCallable mc = new MyCallable();
        //可以获取线程执行完毕之后的结果,也可以作为参数传递给Thread对象
        FutureTask<String> ft = new FutureTask<>(mc);
        //创建线程对象
        Thread t1 = new Thread(ft);
        //开启线程
        t1.start();
        //返回线程执行结束的结果
        System.out.println(ft.get());
    }
}
//结果
跟女孩表白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次
跟女孩表白32次
跟女孩表白33次
跟女孩表白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次
跟女孩表白86次
跟女孩表白87次
跟女孩表白88次
跟女孩表白89次
跟女孩表白90次
跟女孩表白91次
跟女孩表白92次
跟女孩表白93次
跟女孩表白94次
跟女孩表白95次
跟女孩表白96次
跟女孩表白97次
跟女孩表白98次
跟女孩表白99次
答应

 三种方式对比

实现Runnable

Callable接口

扩展性强,实现该接口的同时还可以继承其他的类.

编程相当于复杂,

不能直接用Thread类种的方法

继承Thread类编程比较简单,可以直接使用Thread中的方法可以扩展性较差,不能在继承其他的类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值