多线程 及线程同步问题详解

本文详细介绍了Java中的多线程概念,包括线程的创建方式、线程安全问题以及解决方法。通过对比分析synchronized关键字与Lock接口,阐述了线程同步的重要性,并探讨了线程间通信的唤醒等待机制。
摘要由CSDN通过智能技术生成

多线程

###  多线程:

- 程序:一个可执行文件

- 进程:一个正在运行的程序,也可以理解成为内存中的开辟的存储空间

- 线程:负责程序的运行,可以看作是一条执行的通道或执行单元,所以我们通常将进程的工作理解成线程的工作。

进程中可不可以没有线程?必须有线程,至少有一个,当有一个线程的时候我们称为单线程(唯一的线程就是主线程)当有一个以上的线程同时存在的时候我们称为多线程

- 任务区:就是run()方法,我们将线程工作的地方称为任务区。每一个线程都有一个任务区,任务区通过对应的方法产出作用。

* JVM默认是多线程吗?

* 至少要有两个线程:

* 主线程:任务区:main函数

* 垃圾回收线程:任务区:finalize函数

线程实现的意义就是干活

- 当线程没有结束的时候,进程也不能结束。线程之间都是在抢CPU因为CPU有随机性。

创建线程

默认情况下,主线程和垃圾回收线程都是由系统创建的,但是我们需要完成自己的功能----创建自己的线程对象,ava将线程面向对象了,形成的类就是Thread,在Thread类内部执行任务的方法叫run().

注意1:如果想让run作为任务区,必须让他去被自动调用.我们通过执行start()方法,来开启线程,继而实现run方法的自动调用.

主线程的名字:main   子线程的名字:从Thread-0开始命名

1. 直接使用Thread();创建对象,创建线程,然后.start(),开启线程。

2. 使用子类对象创建对象,重写 run()方法,实现我们的功能,run就是我们的任务区。

1.Thread.currentThread():获取的是当前的线程

2.Thread.currentThread().getName():线程的名字

注意2:run()方法本来是空的,它里面的存放的是线程要做的工作,所以这里必须继承Thread,重写run()方法

注意3:run()方法不能手动创建?因为如果我们手动调用run()方法的时候,它失去了任务区的功能,变成了一个普通的方法,其方法还是运行在主线程中,代码在程序中是顺序执行的,所以不会有解决耗时操作的问题。所以不能直接调用线程的run()方法,只有子线程开始了,才会有异步的效果,当thread.start()方法执行了以后,子线程才会执行run()方法,这样的效果和在主线程中直接调用run()方法的效果是截然不同的。

实现多线程的方式两种:

-  第一种方法:通过创建Thread子类的方式实现功能–线程和任务绑定在一起,操作不方便。当多个线程要执行一个任务时,创建多个线程,这是就会有多个任务,虽然能定义一个static变量来实现你需要的功能,但是不符合逻辑。


public class Demo5 {

    public static void main(String[] args) {

        SubThread t0 = new SubThread();

        SubThread t1 = new SubThread();

        SubThread t2 = new SubThread();

        SubThread t3 = new SubThread();

        //开启线程

        t0.start();

        t1.start();

        t2.start();

        t3.start();

    }

}



class SubThread extends Thread{

    static int  sum = 20;//大家共用这个变量

    @Override

    public void run() {
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值