如何实现多线程?实现多线程为什么要调start,而不是run方法?(继承Thread类、实现Ruable接口、Callable<V>)

本文详细介绍了多线程的概念,包括进程、线程的区别以及线程在操作系统中的角色。接着,文章阐述了Java中实现多线程的三种方式:继承Thread类、实现Runnable接口和实现Callable接口。重点讨论了为何要调用start方法而非直接调用run方法,以及Thread类与Runnable接口之间的关系。最后,提到了Callable接口在多线程中有返回值的情况下的应用。
摘要由CSDN通过智能技术生成

什么是进程?
操作系统中一个程序的执行周期(从打开到关闭)。进程是具有一个或多个线程的线程组。
什么是线程?

  • 一个进程可以同时执行多个任务,任务就是线程,一个进程至少有一个线程。
  • 线程运行在进程内部,线程是轻量级进程。

进程和线程比较:

  • 与进程相比,线程更加轻量级,创建,撤销一个线程比启动、撤销一个进程开销小的多。一个进程中的所有线程共享此进程的所有的资源;
  • 没有进程就没有线程,进程一旦终止,其内的线程也不复存在;
  • 进程是操作系统资源分配的基本单位,进程可以独享资源;
    线程需要依托进程提供的资源,无法独立申请操作系统资源,是操作系统任务执行 (cpu调度) 的基本单位。

多线程的表现:360浏览器可以同时下载多个图片或者响应用户的其他请求;
在高峰期买票时,12306需要同时处理多个客户的请求,但是请求数量过多,也就是访问线程量过多,会导致12306服务器崩溃…

实现多线程
实现多线程有三种方式:

  • 继承Thread类实现多线程
  • Runable接口实现多线程
  • 实现接口Callable来实现多线程(juc)

一:继承Thread类实现多线程
java.lang.Thread 是线程操作的核心类。新建一个线程最简单的方法是直接继承Thread类,而后覆写run( )方法(相当于主线程的main方法)。run是线程的入口方法。

///继承Thread类实现多线程

class Mythread extends Thread
{
   
    private String title;
    public Mythread(String title)
    {
   
        this.title=title;
    }
    @Override
    public void run()  //run是线程的入口,相当于main
    {
   
        for(int i=0;i<10;i++)
        {
   
            System.out.println(title+" "+ i);
        }
    }
}

public class Thread1
{
   
    public static void main(String[] args) {
   
        //有3个线程
        Mythread thread1=new Mythread("thread1");
        Mythread thread2=new Mythread("thread2");
        Mythread thread3=new Mythread("thread3");
        thread1.run();  //线程直接调用run方法
        thread2.run();
        thread3.run();
    }
}

在这里插入图片描述
从结果看出,三个线程顺序打印,并没有实现多线程,是因为实现多线程必须用Thread.start()方法。
任何启动多线程的方式都是调用Thread类中的start()方法。

//Thread类的start方法
public class Thread1
{
   
    public static void main(String[] args) {
   
        Mythread thread1=new Mythread("thread1");
        Mythread thread2=new Mythread("thread2");
        Mythread thread3=new Mythread("thread3");
        thread1.start();  //实现多线程必须用Thread类的start方法
        thread2.start();
        thread3.start();
    }
}

在这里插入图片描述
从结果看书,调用start实现了多线程,即同时执行多个任务。

为什么要调用start方法不能直接调用run方法实现多线程?
先看调用Thread.start( )方法实现多线程过程:

Thread.start( )源码:

public synchronized void start() {
   
    
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        group.add(this);

        boolean started = false;
        try {
   
            start0();   //调用start0方法
            started = true;
        } finally {
   
            try {
   
                if (!started) {
   
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
   
            }
        }
    }
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值