Java之多线程入门

并发和并行

并行:在同一时刻,有多个任务在多个CPU上同时运行

并发:在同一时刻,有多个任务在单个CPU上交替运行

进程和线程

进程:在多任务操作系统中,每个独立执行的程序,也就是操作系统中正在运行的应用程序

线程:程序运行的基本执行单元,就是应用程序中做的事情

什么是多线程?

是指从软件或者硬件上实现多个线程并发执行的技术

具有多线程能力的计算机因有硬件支持而能够在同一时刻执行多个线程,提升性能

怎么实现多线程?

1.继承Thread类

用到方法:

public void run() :线程执行任务的方法,是线程启动后第一个执行的方法

public void start() :启动线程的方法,线程对象调用该方法后,Java虚拟机就会自动调用此线程的run方法

步骤:

  1. 创建一个子类,继承Thread类 (创建的子类:也是线程类)

  2. 在子类中,编写让线程帮助完成的任务(任务代码)

    重写Thread类中的run方法(线程任务)

  3. 启动线程

弊端:类只能单一继承
 public class 子类 extends Father  { 
    }//像这样的类就不能再写Thread类了
//多线程开发
//继承Thread类(当前类为线程类)
public class MyThread extends  Thread {
    @Override
    public void run() {
        System.out.println("新的线程开始执行:");
        for(int i = 100; i < 200; i++){
            System.out.println("新线程" + i);
        }
    }
}

public class ThreadDemo {
    public static void main(String[] args) {
        System.out.println("进入到main方法中执行代码...");
        //创建一个线程对象
        MyThread myThread = new MyThread();
        myThread.start();//启动线程:代码底层自动调用run方法
        
        //main方法中的代码
        for(int i = 0; i <= 1000; i++){
            System.out.println(i);
        }
    }
}

2.实现Runnable接口

使用构造方法:

public Thread(Runnable target)

public Thread(Runnalbe target , String name)

步骤:

  1. 创建一个子类, 实现Runnable接口

  2. 在子类中,重写Runnable接口中的方法:run (线程任务方法)

  3. 创建Thread类对象, 并把实现了Runnable接口的子类对象,作为参数传递给Thread类对象 new Thread( Runnable类型的对象 )

  4. 启动线程

//创建一个子类:线程任务类 实现Runnable接口
public class MyTask implements Runnable{
    //线程任务功能
    @Override
    public void run() {
        System.out.println("新的线程开始了");
        for (int i = 100; i < 200; i++) {
            System.out.println("新线程"+i);
        }
    }
}
public class ThreadDemo2 {
    public static void main(String[] args) {
        System.out.println("进入main方法中开始执行");
        //创建线程任务对象
      MyTask mt = new MyTask();
        //创建线程类对象,并指定要执行的任务
       Thread t = new Thread(mt);
        //启动线程
        t.start();
      //底层代码会自动调用run方法
        for (int i = 0; i < 1000; i++) {
            System.out.println(i);
        }
    }
}

//线程任务 : Runnable接口实现类

//线程功能 : Thread类

推荐使用Runnable接口的方式,好处:解耦

接口的作用:

  1. 制定规则

  2. 可以降低耦合 (耦合:程序之间紧密连接的程度) //程序都是要求低耦合

线程类常用功能

String getName() : 返回此线程的名称
void setName(String name)  :  将此线程的名称更改为等于参数的name
//通过构造方法也可以设置线程名称
public static Thread currentThread()  : 返回当前正在执行的线程对象的引用
public static void sleep(long time) : 让线程休眠指定的时间,单位为毫秒
public void join() : 具备阻塞作用,等待这个线程死亡,才会执行其他线程
public class ThreadTask implements Runnable{
    @Override
    public void run() {
        System.out.println("新线程开始执行:");
        //获取当前线程对象
        Thread thread = Thread.currentThread();
        //获取当前线程名称
        String name = thread.getName();
        for(int i = 100; i < 200; i++)
        {
            System.out.println(name + ":" + i);
        }
    }
}
public class Test{
    public static void main(String[] args) {
        System.out.println("hello");
        //链式写法
        new Thread(new ThreadTask()).start();//Thread-0:193

        //修改线程名字
//        new Thread(new ThreadTask(), "hello").start();//hello:191

        //让当前线程休息500毫秒
        try {
            Thread.sleep(500);//会报异常,我们用捕获处理
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        for (int i = 0; i < 1000; i++) {
            System.out.println(i);
        }
    }

}

public class ThreadTask implements Runnable{
    @Override
    public void run() {
        //让当前线程进入到阻塞状态(暂停了)要直到其他线程执行完才会执行,但是很遗憾,main方法中并没有给它提示,所有下面的代码不会被执行
        try {
            Thread.currentThread().join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("新线程开始执行:");
        //获取当前线程对象
        Thread thread = Thread.currentThread();
        //获取当前线程名称
        String name = thread.getName();
        for(int i = 100; i < 200; i++)
        {
            System.out.println(name + ":" + i);
        }
    }
}

public class Test{
    public static void main(String[] args) {
        System.out.println("hello");
        //链式写法
        new Thread(new ThreadTask()).start();//Thread-0:193

        //修改线程名字
//        new Thread(new ThreadTask(), "hello").start();//hello:191

        for (int i = 0; i < 1000; i++) {
            System.out.println(i);
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值