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

初学Java之线程基础

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

初学Java之线程基础

萌新多多关照

文章目录

目录

前言

一、线程相关概念

1. 什么是程序?

2. 什么是进程?

3. 并发和并行

二、线程的基本使用

         1.继承Thread,重写run方法。

2.实现Runnable接口

3. 继承Thread与implements Runable的区别

三、线程常用的方法

四、线程的生命周期

五、线程同步机制

        1.synchronized关键字

        2. 释放锁

总结



前言

一篇搞定线程基础


提示:以下是本篇文章正文内容,下面案例可供参考

一、线程相关概念

1. 什么是程序?

就是完成特定任务,用某种语言编写的一组指令的集合-----> 我们所写的代码。

2. 什么是进程?

(1)进程就是指正在运行的程序,比如我们打开微信,使用微信时,就启动了一个进程。

(2)进程是程序的一次执行的过程,是动态过程,它具有自己的产生、存在和消亡的过程。

 这就是一个个进程

3. 并发和并行

1. 并发

   同一时刻,多个任务交替执行,由于交替速度很快,造成“同时进行的错觉”

可以简单理解为单核CPU执行多个任务就是并发。

2. 并行

        同一时刻,多个任务同时执行,多核CPU可以实现并行。注意: 并行和并发可同时存在

例如CPU1。


二、线程的基本使用

1.继承Thread,重写run方法。
public class TreadFirst {
    public static void main(String[] args) throws InterruptedException {
        T t = new T();
        t.start();
        
        for (int i = 0; i < 20; i++) {
            Thread.sleep(50);//休眠50毫秒
            System.out.println("这是main主线程");
        }//查看输出效果
    }
}
class T extends Thread {
    private int sum = 0;
    @Override
    public void run() {
        //此处写你的业务逻辑,数求和为例
        for (int i = 1; i < 20; i++) {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("这是子线程" + i);
        }
    }
}

输出效果

这是main主线程
这是子线程1
这是main主线程
这是子线程2
这是main主线程
这是子线程3
这是main主线程

********

注解:通过调用start()方法,根据动态绑定机制,底层会执行我们重写的run方法。

(动态绑定机制:当调用对象方法时,该方法会与该对象的内存地址/运行类型相绑定,调用属性时,看编译类型。)

2.实现Runnable接口

在Java中,因为单继承机制,为了避免一个类已经继承了一个类,不能实现线程,故出现了接口。

代码实现如下

public class TreadFirst {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new T());//代理模式
        thread.start();
        
        for (int i = 0; i < 20; i++) {
            Thread.sleep(50);//休眠50毫秒
            System.out.println("这是main主线程");
        }//查看输出效果
    }
}
class T implements Runnable{
    private int sum = 0;
    @Override
    public void run() {
        //此处写你的业务逻辑,数求和为例
        for (int i = 1; i < 20; i++) {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("这是子线程" + i);
        }
    }
}

通过对比,我们发现main方法中仅有这条语句不同

Thread thread = new Thread(new T());

这里是代理者模式,通过接受Runnable的实例,来完成其对线程的开启

3. 继承Thread与implements Runable的区别

1. 本质没区别-----查看Thread的类图

 继承Thread 本质上也是实现了Runnable接口

2. Runable接口更适合资源共享的情况,同时避免了单继承的机制。

三、线程常用的方法

1.setName //设置线程的名称  

2. getName  //返回线程的名称

样例

3. start(前面用过)

4. run //调用对象的run方法,只是普通方法,并不会启动一个子线程。

5. setPriority //更改线程的优先级。

6. getPriority //获取线程的优先级。

7. sleep () //休眠,以毫秒为单位。

8. interrupt //中断线程,不是终止,线程会继续执行,中断该线程的某一个操作。

Thread thread = new Thread(new T());
        thread.setPriority(Thread.MAX_PRIORITY);//最高优先级
        thread.setPriority(Thread.MIN_PRIORITY);//最低优先级
        thread.setPriority(Thread.NORM_PRIORITY);//中间优先级

9. yield //让出CPU,但是不一定成功,取决了CPU

10. join //线程的插队,在main中调用t.jion()l,让 t 的线程插进来,执行完,main继续执行

用户线程:也叫工作线程,当线程的任务执行完毕或通知结束时结束。

守护线程:一般为工作线程服务的,当所有的用户线程结束,守护线程自动结束。

11 setDaemon(boolean t ) //设置守护线程

四、线程的生命周期

生命周期的六个状态-----JDK文档

如果把Runnable细分的话,可以细分两个状态(1)ready (2)running

可参考图

五、线程同步机制

1.synchronized关键字

(1)线程同步。

(2)可作用于一个方法,类,代码块。

(3)保证在多线程下,在同一时刻,只有一个线程进入操作被synchronized修饰的,保证数据的准确性。

(4)同步方法(如果是静态的)的锁可以是this,也可以是其他对象,要求是同一个对象。

(5)同步方法为静态时的锁为当前类对象。

(6)会降低效率。

2. 释放锁

(1)线程下面操作后可以释放锁

(1)当同步代码块执行完毕

(2)同步代码中遇到 break,return。

(3)同步代码块异常结束。

(4)同步方法中使用wait方法,暂停线程并释放锁。

(2)线程下面操作后不可以释放锁

(1)同步代码块中 调用thread.sleep(),thread.yeild()

(2)线程执行同步代码代码块时,其他线程调用该线程的suspen()方法

总结

以上就是线程基础部分啦,欢迎大家讨论。

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

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

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