萌新多多关照
文章目录
目录
前言
一、线程相关概念
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);
}
}
}
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 //返回线程的名称
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()方法
总结
以上就是线程基础部分啦,欢迎大家讨论。



