进程和线程
- 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程,进程有有独立的系统资源和内存空间
- 线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
多线程
多线程就是多个线程同时运行或交替运行。单核CPU的话是顺序执行,也就是交替运行。多核CPU的话,因为每个CPU有自己的运算器,所以在多个CPU中可以同时运行。
好处:
- 提高用户体验
- 简化代码模型
- 充分利用CPU资源
多线程的创建步骤
①继承Thread类
优势:数据资源各论各的,单继承,创建线程简单
在这里插入代码片public class ThreadA extends Thread{
//重写run()方法:需要线程完成的任务
@Override
public void run(){
for (int i = 1; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"\t"+i);
} //获取当前正在工作的线程的名字
}
public static void main(String[] args) {
//创建线程对象
ThreadA ta=new ThreadA();
ThreadA tb=new ThreadA();
ta.setName("来自线程Thread-0");
tb.setName("来自线程Thread-1");
//启动线程
//ta.run();
ta.start();
tb.start();
}
}
运行结果
②实现Runnable接口
优势:数据资源共享,避免单继承的局限性
public class ThreadB implements Runnable{
public int num=5;
@Override
public void run() {
for (int i = 1; i < 10; i++) {
System.out.println("你好,"+Thread.currentThread().getName()+"\t"+i);
}
}
public static void main(String[] args) {
//创建当前类的对象
ThreadB t=new ThreadB();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.setName("来自线程Thread-0");
t2.setName("来自线程Thread-1");
t1.start();
t2.start();
}
}
运行结果
ps:调run和调start的区别
a.run:当前程序中只有main一条线程,所有事情需要main来完成
b.start:开启一个全新的线程,主线程负责main方法中的代码,开启的线程负责run方法中的代码,各司其职。
线程的五个状态
1.创建状态:ThreadA ta=new ThreadA();
2.就绪状态:线程启动以后,没有抢占到CPU资源
3.运行状态:程序抢到资源开始完成自己的任务
4.阻塞状态:程序员调用某个方法将线程转入休眠状态,冻结 不会和其他线程抢占资源
5.死亡状态:调用方法+自然死亡
线程同步
解决问题:多个线程抢占同一个资源出现冲突的问题
同步代码块: synchronized(this){代码}
public class ShanDongThread implements Runnable{
//模拟10个人通过1个山洞,每个人要通过山洞需要5秒钟
private String dong="山洞";
//定义过山洞的方法
public void guo(){
synchronized (dong) {
//模拟用时5秒的过程
System.out.println(Thread.currentThread().getName()+"正在通过山洞!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
this.guo();
}
public static void main(String[] args) {
ShanDongThread sd=new ShanDongThread();
new Thread(sd).start();
new Thread(sd).start();
new Thread(sd).start();
new Thread(sd).start();
}
}
线程安全:实现线程同步则认为线程是安全的,但是效率比较低。