标题重复率高,所以取名java学习----重点复习(多线程1)

前言

头真的大,现在听课的状态没有前几天好了,我感觉对于知识的理解很不到位,内心也很焦躁,因为每天要固定的那么多学习量,但是有很多内容只是有一个大概的感觉,虽然有些东西并不是很难,但是可能还是接口,抽象类的继承那一块还是没有重充分的理解透彻,所以跟着课程在看api文档,也没办法立刻跟上。今天我准备停一停,仔细总结下之前学过的知识点。

线程

基本介绍

在介绍线程之前,首先得了解一个程序在电脑中的整个过程:
首先java程序会进入内存中,然后系统会分配给java进程(系统中资源分配的最小单位)一块内存空间,然后当需要执行程序的时候,在将该经常放到cpu上执行。但是在日常的许多程序中往往可以同时完成不同的功能,那么这就是因为在这一个进程中又被划分为许多小的线程(执行的最小单位),那么这一个个线程就可以独立的进行自己的工作。
我们平时常写的main()方法下运行的程序就是只有一个线程的单进程,但是有时候如果在程序运行过程中突然有一处卡住了,那么其他本来无关的内容也就受了影响,所以这个时候如果在main()中开辟另外一条线路,让他们彼此不受干扰的执行,那这样就可以解决上面的问题了。那么现在我们就来创建多线程的程序。

多线程的实现方式

1.方式一:Thread类

①创建一个类声明为Thread的子类,并且重写Thread类中的run方法
②在主方法中创建那个类的对象
③通过那个对象调用strart()方法(这个方法是线程开始执行,java虚拟机调用该线程的run方法)

//创建类
public class Demo01 extends Thread{
    @Override
    public void run(){
        for(int i=0;i<20;i++){
            System.out.println("run:"+i);
        }

    }
}
public class DemoTest {
    public static void main(String[] args) {
        Demo01 demo01=new Demo01();
        demo01.start();
        for(int i=0;i<20;i++){
            System.out.println("main:"+i);
        }

    }

结果一部分截图:在这里插入图片描述
这种方式开辟新线程的原理:
main方法中会调用start方法,然后这个方法会开辟一块新的栈空间(注意:这块空间是完全独立的一块运行空间,也就说这一刻开始后面的运行就和main方法无关了,直到结束),在这个栈空间内执行run()方法。

2.方式二:通过Runnable接口

这种方式可能更加的实用些,因为前面继承父类的方式,在java这种单继承的语言中就会受限制,所以最好是可以使用该接口来创建。
①创建一个实现类来实现Runnable接口(因为接口肯定是不能直接使用的,除非你有静态方法)
②在接口中重写Runnable的run()方法;
③在测试代码中创建一个实现类的对象;
④再创建一个Thread对象,构造方法中传递Runnable接口的实现类对象
⑤再通过这个对象去调用start()方法(这一步同上)

//实现类
public class RunnableImpl implements Runnable{
    @Override
    public void run() {
        System.out.println("新的run方法");
        for(int i=0;i<20;i++){
            System.out.println(Thread.currentThread().getName()+"-->"+i);
        }
    }
}
//测试类
public class nicai{
    public static void main(String args[]){
        Runnable r=new RunnableImpl;
        Thread th=new Thread(r);
        th.start();
    }
}

这种创建方式还增强了程序的可拓展性,降低了程序的耦合性(将线程的设置,和线程的打开使用进行分开)

补充:这一种方式其实也会经常用,但是主要还是第二种

方式三:匿名内部类创建多线程

直接再Thread创建对象时的构造方法中再接着创建一个Runnable接口的实现类

   new Thread(){
            public void run(){
                for(int i=0;i<20;i++){
                    System.out.println(Thread.currentThread().getName()+"-->"+i);
                }
            }
        }.start();

或者时通过Runnable接口的实现类

Runnable r=new Runnable(){
            @Override
            public void run() {
                for(int i=0;i<20;i++){
                    System.out.println(Thread.currentThread().getName()+"-->"+"chengxuyuan");
                }
            }
        };
        new Thread(r).start();

java状态

在这里插入图片描述
①线程创建
②线程创建后首先会等待,进入就绪态,因为再cpu中可能正在有其他的程序正在执行
③通过一些调用算法的排序,轮到你从就绪队列里走出后,你也就进入了运行状态
④在这个过程中你可能会出现等待其他资源的过程(比如你在等待打印机打印),那么这个时候你就可能会回到(同步阻塞,等待阻塞等)的状态
⑤最后如果执行结束了,那么就会进入死亡状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值