关于Java线程的理解

关于进程和线程都是在学习操作系统是要掌握的东西,在编程时我们也经常会遇见,理解程序的执行和程序的调用,以及程序执行是对资源的需求是很重要的。在JAVA编程时,创建线程,编写线程程序也是很重要的,应该说是需要掌握的。在Java中有专门的线程类和接口来提供线程创建。这里大致做一个总结。

进程
进程就是正在运行的程序,分配内存让应用程序能够运行,Windows系统号称多任务(可以同时运行多个应用程序)。
宏观上看:windows确实是允许多个程序
微观上看:CPU快速切换执行任务,由于速度特别快,我们人感觉不到这个切换的过程

线程
线程在一个进程中负责代码的执行,就是一个进程中的执行路径。Java程序在运行的时候,jvm会帮我们创建一个主线程来执行代码,主线程主要负责main方法中的代码执行。

一个java程序中至少有2个线程:一个是主线程主要负责main方法中的代码执行,一个垃圾回收站线程,负责垃圾回收。

多线程:
在一个进程中多个线程同时执行不同的任务。

多线程的好处:

  1. 解决一个进程中同时执行多个任务的问题
  2. 提高资源的利用率

多线程的弊端:

  1. 增加CPU的负担,不是线程越多越好
  2. 降低了一个进程中线程的执行概率
  3. 线程容易引发线程安全问题
  4. 容易出现死锁现象

Java中创建线程
方式一:Thread(线程类)
​ 1. 需要定义一个类来继承Thread类
​ 2. 重写thread类中的run方法,把自定义线程的任务代码写在run方法中。
​ 3. 创建Thread的子类,并且调用start方法开启线程

注意点:一旦线程开启了,会默认执行线程对象中的run方法,但是千万不要自己直接调用run方法,如果直接调用run方法就和普通方法没什么区别。

方式二:
​ 1.自定义一个实现Runable接口,接口中会提供一个run方法
​ 2.实现Runable接口中的run方法,将线程中的任务写在run方法中
​ 3.创建Runable接口的实现对象
​ 4.创建一个Thread对象,并且把Runable实现类创建的对象作为参数
​ 5.调用Tread对象的star方法来开启线程

线程的生命周期:

  1. 创建:新创建了一个线程对象。
  2. 可运行:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取 cpu 的执行权。
  3. 运行:就绪状态的线程获取了CPU执行权,执行程序代码。
  4. 阻塞:阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
  5. 死亡:线程执行完它的任务时。

线程中常用的方法:

Thread(String name) 初始线程的名字

getName() 返回线程的名字

setName(String name) 设置线程对象名

Sleep() 线程睡眠的指定毫秒数

getPriority() 返回当前对象的优先级 默认线程的优先级是5

currentThread() 返回CUP正在执行的线程的对象

java给线程加锁

方式一:同步代码块
锁对象可以是任意一个java中的对象(任意类型的对象), Java中的任意一个对象都会有一个对象的状态,就可以通过对象的状态作为锁的一个标识符 列如: status = 0 表示锁关闭 status=1表示打开。

同步代码块的使用注意点:

​ 1.任意一个对象都可以做锁对象。
​ 2.如果你在同步代码块中调用了sleep方法,不会释放锁对象。
​ 3.只有正真的存在线程安全的时候才需要使用同步代码块,否则会降低执行效率。
​ 4.多线程操作锁对象必须是唯一,否则无效。

出现线程安全的问题根本原因:

​ 1.存在两个或者两个以上的线程,并且线程之间共享着一个资源
​ 2.多个语句操作共享资源

方式二:同步函数

用关键字synchronized 修饰函数同步函数是有锁对象的,同步函数的使用是一个静态函数。注意点:

​ 1.如是一个非静态的函数,同步函数的锁就是调用方法的对象(this对象),如果是一个静态同步函数的锁对象是当前函数所属类的字节码文件(class对象)
​ 2.同步函数的锁对象是固定的,不能够自己指定
​ 3.同步函数是同步整个函数的代码

同步代码块和同步函数中,优先使用同步代码块,原因:
​ 1.同步代码块的锁对象可以由我任意指定,同步函数是固定的
​ 2.同步代码块可以控制被同步范围,同步函数必须是整个函数的所有代码都被同步

线程死锁现象问题:
线程死锁不一定会出现,有可能会出现,死锁现象的解决方法:没有方案,尽量避免.

问题:为什么要将Runable接口实现类的对象作为参数传递?
为了让对象中的run方法能够在线程中的run方法中执行,也就是能够将这个对象中的run方法作为线程中的任务来执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值