《线程,死锁,守护线程》

自定义线程

进程:正在执行的程序称作为一个进程,进程负责了内存空间的划分

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

Main主线程:任何一个java程序,jvm在运行的时候都会创建一个main线程执行main方法中所有的代码

Java应用程序中至少有几个线程:至少有两个线程,一个是主线程负责main方法代码的执行,一个是垃圾回收器线程,负责了回收垃圾。

多线程的好处:

1. 解决了一个进程能同时执行多个任务的问题

2. 提高了资源的利用率

多线程的弊端:

1. 增加了cpu的负担

2. 降低了一个进程中线程的执行概率

3. 引发了线程安全问题

4. 出现了死锁现象

创建线程的方式:

方式一:

1. 自定义一个类继承thread

2. 重写threadrun方法

3.创建thread的子类对象,并且调用start方法开启线程,一个线程一旦开启,那么线程就会执行run方法中的代码,run方法千万不能直接调用,直接调用run方法就相当于调用一个普通的方法而已,并没有开启一个新的线程。

方式二:

1. 自定义一个类实现runnble接口

2. 实现runnable接口的run方法,把自定义线程的任务定义在run方法上

3. 创建runnable实现类对象

4. 创建thread类的对象,并且把runnable实现类的对象作为实参传递

5. 调用thread对象的start方法开启一个线程

Runnable实现类的对象并不是一个线程对象,只不过是实现了runnable接口的对象而已,只有thread或者是thread的子类才是线程对象。

线程声明周期

线程的声明周期:创建状态,可运行状态,运行状态,临时阻塞状态,死亡状态。

运行阻塞状态:运行状态下的线程一旦执行了sleep或者是wait方法之后,那么该线程会进入临时阻塞状态下,如果线程调用了sleep方法进入的临时阻塞状态,那么线程一旦超过了指定的睡眠时间,那么就会重新进入可运行状态,如果调用了wait方法进入了临时阻塞状态,那么需要其他线程唤醒该线程才可以重新进入可运行状态。

线程常用的方法:

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

GetName() 返回线程的名字

SetName(String name) 设置线程的名字

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

Rhread类的run方法没有抛出异常类型,所以子类不能抛出异常

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

Setpriority() 设置线程的优先级

currentThread() 返回当前线程对象,该方法是一个静态的

线程安全

出现线程安全原因或者什么时候使用锁机制:

1. 存在两个或者两个以上的线程对象,而且线程之间共享一个资源

2. 有多个语句操作了共享资源

Java线程同步机制的方式:

方式一:同步代码块

Synchronized(锁对象){

需要被同步的代码...

}

同步代码块要注意的事项:

1. 锁对象可以是任意的一个对象

2. 在同步代码块中调用了sleep方法并不会释放锁对象

3. 只有真正存在线程安全问题的时候才使用同步代码块,否则会降低效率

4. 多线程操作的锁对象必须是唯一共享的(也就是只有一个对象)。否则无效

方式二:同步函数

可以通过Synchronized修饰一个函数

同步函数要注意的事项:

1. 如果是一个非静态的函数的锁对象是this对象,如果是静态的同步函数的锁对象时当前函数所属的类的字节码文件(class对象)

2. 同步函数的锁对象是固定的,不能由你来指定的

推荐使用同步代码块

1. 同步代码块的锁对象可以由我们随意指定,方便空值,同步函数的锁是固定的,不能由我们来指定

2. 同步代码块可以很方便控制需要被同步代码的范围,同步函数必须是整个函数的所有代码都被同步了

死锁

死锁现象出现的根本原因是什么:

1. 存在两个或者两个以上的线程

2. 存在两个或者两个以上的共享资源

死锁现象出现的解决方案:只能尽量避免发生

线程的通讯

线程通讯的含义:一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务。

Wait() 等待。如果线程执行了wait()方法,那么该线程会进入等待的状态,等待状态下的线程必须要notify()方法唤醒

Notify() 唤醒。唤醒等待的线程

Wait()notity()注意事项:

1. wait方法与notity方法是属于object对象的。

2. Wait方法与notity方法必须要在同步代码块或者是同步函数中才能使用。

3. Waitnotity必须要有锁对象调用。

线程的方法

Wait一个线程如果执行了wait方法,那么该线程就会进去一个以锁对象为标识符的线程池中等待

Notity如果一个线程执行了notity方法,那么就会唤醒以锁对象为标识符的线程池中等待的线程其中一个。

Interrupt把线程的等待状态强制清除,可以指定清除哪个线程的等待状态,被清除状态的线程会接收到interruptexception异常

线程的停止:

1. 停止一个线程我们一般都会通过一个变量去控制的

2. 如果停止一个处于等待状态下的线程,我们需要通过变量配合notity方法或者interrupt方法停止一个线程

后台线程

守护线程:在一个进程中如果只剩下了守护线程,那么守护线程也会死亡

怎么判断一个线程是不是守护线程:

Isdeamon()判断一个线程是否是守护线程

设置线程是守护线程:setdaemon设置线程是否为守护线程,只有truefalse

一个线程默认都不是守护线程

Join方法:加入的意思,如果一个线程如果执行了join语句,那么就有新的线程加入,执行语句的线程必须要让步给新加入的线程完成任务,然后才能继续执行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值