多线程知识点总结

多线程知识点总结

1认识进程与线程

进程:是指正在运行的程序。是程序一次动态执行的过程,它对应了从代码加载、执行直到执行完成的一个完整的过程,这个过程也是进程本身从产生、发展直到消亡的过程。

进程的特点:

  1. 运行的程序

  2. 内存分配的最小单位

  3. 每个进程都有自己独立的内存空间和资源

  4. 每个进程的内部数据和状态都是完全独立的。

线程:进程中执行运算的最小单位,一个进程中可以包含多个线程,一个线程必须在某个进程内执行

线程的特点:

  1. 线程是进程中一个个执行序列

  2. 线程是cpu执行的最小单位

     

线程与进程之间的区别:

相同点:都可以代表程序的执行流,都是整个程序运行的划分单位

区别进程线程
持有的资源不同 进程都有自己独立的资源 线程共享进程的资源
是否可以共享内存空间 进程都有自己独立的进程空间,进程之间不能直接访问内存,进程是内存划分的最小单位 没有独立的空间,依赖于进程,所有同一进程下的线程,共享内存
创建的开销不同 进程的创建、销毁、调度的开销大,比较慢 线程是轻量级进程,创建、销毁、调度开销小,灵活
包括关系不一样 进程中至少包含了一个线程,当进程中最后一个线程执行完毕后进程也会结束 线程结束,进程不一定会结束

 

2使用多线程的意义

  • 可以获得并行执行的效果

  • 提高执行速度

  • 为了用户得到更好的感受

  • 可以把复杂的或长时间执行的代码放在后台执行,让执行的程序有很完美的用户感受

  • 例子:加载10万条数据到用户界面,可以用一个线程从数据库中获取数据,另一个线程进行刷新

3.编写线程类

每个程序至少必须有一个线程,成为主线程。当程序加载到内存时启动主线程。

在开发中,用户编写的线程一般都是指除了主线程之外的其他线程

3.1使用一个线程的过程大致可以分为以下四个步骤:

  1. 定义一个线程,同时指明这个线程所要执行的代码,即期望完成的功能

  2. 创建线程对象

  3. 启动线程

  4. 终止线程

3.2定义线程的方式

  • 继承java.lang.Thread类

  • 实现Runnable接口

  • 实现Callable接口

  • 利用线程池

3.3使用Thread类进行线程创建

Thread中常用的一些方法:

方法说明
void run() 执行任务操作的方法
void start() 是该线程开始执行
void sleep() 在指定的毫秒数内让当前正在执行的线程休眠
String getName() 获取当前正在执行的线成名称
int getPriority() 返回线程的优秀级
void setPriority(int newPriority) 更改线程的优先级
Thread.state getState() 返回该线程的状态
boolean isAlive() 测试线程是否处于活动状态
void join() 等待该线程结束
void interrupt() 中断线程
void yield() 暂停当前正在执行的线程对象,并执行其他线程

使用继承Thraed类的方式创建线程,在线程中输出1-100的整数

实现步骤如下:

  1. 定义一个MyThread类继承Thread类,重写run ()方法,在run()方法中实现数据的输出

  2. 创建线程对象

  3. 调用start()方法启动线程

  4. 在主线程中输出1-100的整数

package com.gcy.thread;
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
System.out.println(Thread.currentThread().getName() + "运行到第" + i + "次");
}
}
}


package com.gcy.thread;
public class ThreadDemo {
public static void main(String[] args) {
//为主线程命名为主线程
Thread.currentThread().setName("主线程");
//创建子线程对象mt
MyThread mt=new MyThread();
mt.setName("子线程");
mt.start();
//子线程后继续运行主线程
for(int i=1;i<=100;i++) {
System.out.println(Thread.currentThread().getName()+"运行到第"+i+"次了");
}
}

}

3.4使用Runnable接口进行线程创建

使用Runnable接口的方式创建线程,在线程输出1-100的整数

代码:

package com.gcy.runnable;
public class MyThread implements Runnable {
@Override
public void run() {
for(int i=1;i<=100;i++) {
System.out.println(Thread.currentThread().getName()+"运行到第"+i+"次了");
}
}
}

package com.gcy.runnable;

public class ThreadDemo {
public static void main(String[] args) throws InterruptedException {
//创建子线程的对象为mt
Thread t=new Thread(new MyThread());
t.setName("子线程");
t.start();
//为主线程命名
Thread.currentThread().setName("主线程");
//Thread.currentThread().sleep(20);
for(int i=1;i<=100;i++) {
System.out.println(Thread.currentThread().getName()+"运行到第"+i+"次了");
}
}
}

3.5线程的状态

线程的声明周期可以分为五个阶段:

  1. 开始

  2. 就绪状态

  3. 执行状态

  4. 阻塞状态

  5. 死亡

3.6sleep()和yield()方法区别

sleep()yield()
使当前线程进入被阻塞状态 将当前线程转入暂停执行的状态
即使没有其他等待运行的线程,当前线程也会等待指定的时间 如果没有其他等待执行的线程,当前线程会马上恢复执行
其他等待线程的机会是均等 的 会执行优先级相同或更高的线程

3.7线程同步

当两个线程或多个线程需要访问同一资源时,需要一某种顺序来确保某资源在某一时刻只能被一个线程使用的方式称为线程同步

采用同步来控制线程的方式有两种。即同步方法和同步代码块。这两种方式都使用synchronized关键字来实现。

  • 同步方法

原文地址:https://www.cnblogs.com/juddy/p/12823380.html