对多线程的理解

本文介绍了多线程的概念,通过购买火车票的例子来解释,并详细阐述了线程与进程的区别。文章讨论了创建线程的三种方式:继承Thread类、实现Runnable接口和Callable接口,同时对比了它们的优缺点。接着,文章提到了线程的状态转换,包括创建、就绪、运行、阻塞和死亡,并讲解了yield、sleep、join和wait等方法的作用。此外,文章还涉及了线程同步的重要性,介绍了synchronized关键字和Lock机制,以及线程池的概念,以提高程序性能。
摘要由CSDN通过智能技术生成

首先,什么是多线程。我的理解是多线程就是多个线程同时进行(实际上应该是一个线程来回切换)。比如说买火车票,好几个人同时购买火车票,每一个人购买火车票都是一个线程,多个人同时购买自然就是多线程了。
说到线程,有一个与之相关的概念叫做进程。所谓进程,就是对于程序的一次执行的过程。还是以买火车票为例,买火车票就是进程,因为他要执行买火车票的这个程序。然后呢,一个进程可以有多个线程,但至少得有一个线程,不然就没有意义了。你可以多个人同时买火车票,但起码要有一个人买,不然没人买票跑程序干嘛呢?
对于线程,一般来说有三种创建的方法。第一是继承Thread类,第二种是实现Runnable接口,最后一种是实现Callable接口。
首先是继承Thread类,这个有三步。
第一步是自定义线程继承Thread类
第二步是重写run()方法
第三步是创建线程对象,调用start()方法启动线程
以我写的这个为例

package Demo02;

public class ThreadExample extends Thread{
   
    @Override
    public void run() {
   
        Print print=new Print();
        for (int i = 0; i < 3; i++) {
   
            print.print(i);
        }
    }

    public static void main(String[] args) {
   
        ThreadExample t1=new ThreadExample();
        ThreadExample t2=new ThreadExample();
        ThreadExample t3=new ThreadExample();
        t1.start();
        t2.start();
        t3.start();
    }
}
class Print{
   
    public void print(int i){
   
        System.out.println(i);
    }
}

运行以后的结果如图
在这里插入图片描述
然后是实现Runnable接口
同样是分为三步
第一步是自定义一个类实现Runnable接口
第二步是实现run()方法
第三步是创建线程对象,调用start()方法启动线程
以此为例:

package Demo02;

public class RunnableExample implements Runnable{
   
    private String name;

    public RunnableExample(String name){
   
        this.name=name;
    }

    @Override
    public void run() {
   
        Print1 print=new Print1();
        print.print(name);
    }

    public static void main(String[] args) {
   
        RunnableExample t1=new RunnableExample("小红");
        RunnableExample t2=new RunnableExample("小蓝");
        RunnableExample t3=new RunnableExample("小黄");
        new Thread(t1).start();
        new Thread(t2).start();
        new Thread(t3).start();
    }
}

class Print1{
   
    public void print(String name){
   
        System.out.println(name);
    }
}

总的来说,我觉得实现Runnable接口是比继承Thread类要好的,其中有一个很关键的点就是实现Runnable接口可以避免单继承局限性,可以同一个对象被多个线程使用,如下例子:

package Demo02;

public class TestThread implements Runnable{
   
    private int num=10;
    @Override
    public void run() {
   
        while (true){
   
            if (num<=0){
   
                break;
            }else{
   
                System.out.println(Thread.currentThread().getName()+"获得第"+num--+"张票");
            }
        }
    }<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值