栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java线程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java线程

一、线程概述 1.1线程相关概述

进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位。
可以把进程简单理解为正在操作系统中运行的一个程序。
线程
线程(Thread)是进程的一个执行单元。
一个线程就是进程中一个单一顺序的控制流,进程的一个执行分支。
进程是线程的容器,一个进程至少又一个线程。一个进程中也可以有多个线程。
在操作系统中是以进程为单位分配资源,如虚拟存储空间,文件描述符等。每个线程都有各自的线程栈,自己的寄存器环境,自己的线程本地存储。
主线程与子线程
JVM启动时会创建一个主线程,该主线程负责执行main方法。主线程就是运行main方法的线程。
Java中的线程不是孤立的,线程之间也存在一些联系。如果在A线程中创建了B线程,称B线程为A线程的子线程,相应的A线程就是B线程的父线程
串行并发并行

串行:多个任务,执行时一个执行完再执行另一个。比喻:吃完饭再看视频。并发:多个线程在单个核心运行,同一时间一个线程运行,系统不停切换线程,看起来像同时运行,实际上是线程不停切换。比喻: 一会跑去厨房吃饭,一会跑去客厅看视频。并行:每个线程分配给独立的核心,线程同时运行。比喻:一边吃饭一边看视频。

具体查看串行并行与并发 ----串行、并行与并发的理解

1.2线程的创建与启动

在Java中,创建一个线程就是创建一个Thread类(子类)的对象实例。
Thread类有两种常用构造方法:Thread()与Thread(Runnable)对应创建线程的两种方式:

定义Thread类的子类定义一个Runnable接口的实现类
这两种创建线程的方式没有本质的区别
如果我们开启了多个线程,这个start()调用的顺序并不一定就是线程启动的顺序

使用Thread()创建线程案例

public class Thread01 extends Thread {

    //2)重写Thread父类中的run()
    //run()方法体中代码就是
    @Override
    public void run() {
        System.out.println("这是子线程打印的内容");
    }
}

public class Test01 {
    public static void main(String[] args) {
        System.out.println("JVM启动main线程,main线程执行main方法");
        
        Thread01 thread01 = new Thread01();
        thread01.start();
    }
}

使用Thread(Runnable)创建线程案例

public class Runnable01 implements Runnable {
    //2)重写Runnable接口中的抽象方法run(),run()方法就是子线程要执行的代码
    @Override
    public void run() {
        for (int i = 0; i < 200; i++) {
            System.out.println("sub thread --"+i);
        }
    }
}
public class Test01 {
    public static void main(String[] args) {
        //3)创建Runnable接口的实现类对象
        Runnable01 runnable01 = new Runnable01();
        //4)创建线程对象
        Thread thread01 = new Thread(runnable01);
        //5)开启线程
        thread01.start();
        
    }
}

1.3线程的常用方法

1.3.1currentThread()方法:是一个静态方法
Thread.currentThread()方法可以获得当前线程
Java中的任何一段代码都是执行在某个线程当中的,执行当前代码的线程就是当前线程。
同一段代码可能被不同的线程执行,因此当前线程是相对的,Thread.currentThread()方法的返回值是在代码实际运行时候的线程对象。
使用案例

public class Thread03 extends Thread {
    public Thread03(){
        System.out.println("构造方法打印当前线程的名称: "+Thread.currentThread().getName());
    }

    @Override
    public void run() {
        System.out.println("run方法打印: "+Thread.currentThread().getName());
    }
}

public class Test03 {
    public static void main(String[] args) {
        System.out.println("当前main方法中的线程: "+Thread.currentThread().getName());

        // 创建子线程,调用Thread03的构造方法,在main线程中调用构造方法,
        // 所以构造方法中的当前线程就是main线程
        Thread03 thread03 = new Thread03();
        thread03.start(); //启动子线程,子线程会调用run()房啊,所以run()方法中的当前线程就是Thread-0子线程
        thread03.run();  //在main方法中直接调用run()方法,没有开启新的线程,所以在run方法中的当前线程就是main新城
    }

}

测试结果

1.3.2setName()/getName()
thread.setName(线程名称),设置线程名称
thread.getName(),返回线程名称
通过设置线程名称,有助于程序调试,提高程序的可读性,建议为每个线程都设置一个能够体现线程功能的名称。
1.3.3isAlive()
thread.isAlive()判断当前线程是都处于活动状态,活动状态就是线程已启动并且尚未终止。
1.3.4sleep():是一个静态方法
Thread.sleep(millis); 让当前线程休眠指定的毫秒数
1.3.5getId()
thread.getId()可以获得线程的唯一标识
1.3.6yield()
Thread.yield()方法的作用是放弃当前的CPU资源。因为我们线程要执行首先要放弃CPU资源才能执行

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/721348.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号