1. 概述
-
程序:按照一定逻辑编写的代码集合,储存在硬盘
-
进程:正在运行的程序,系统为进程分配内存空间; 进程是资源分配的最小单位
-
线程:在进程中独立运行的代码块,一个进程中可以有多个线程;线程是程序执行的最小单位
-
进程的特点:
- 独立性:进程是系统中独立存在的实体
- 动态性:进程是一个正在系统中活动的指令集合
- 并发性:多个进程可以在系统中并发执行,不会相互影响
-
并发性与并行性
并发是多个进程快速切换,在宏观上具有多个进程同时执行的效果
并行是同一时刻,有多条指令在处理器同时执行
2. 创建调用线程
-
// 创建方式一 // 继承 java.lang.Thread; public class Thread01 extends Thread{ // 重写run方法 @Override public void run() { super.run(); // this.getName() 获取线程名称 System.out.println(this.getName()+"线程执行"); } } // 对应调用方式一 public class Test01 { public static void main(String[] args) { Thread01 thread01 = new Thread01(); // 给线程赋予名称 thread01.setName("thread01"); // start()方法 执行方法 thread01.start(); } }
-
// 创建方式二 // 实现Runnable接口 public class Runable02 implements Runnable{ // 重写run方法 @Override public void run() { System.out.println(Thread.currentThread().getName()+"线程执行"); } } // 对应调用方式二 public class Test02 { public static void main(String[] args) { Runable02 thread02 = new Runable02(); // 将创建文件 Thread thread = new Thread(thread02); // start()方法 执行方法 thread.start(); } }
同一个线程运行多次时会抛出异常 IllegalThreadStateException
3. 线程声明周期
- 创建(new)
- 就绪(runnable):调用start(),等待cpu调度
- 运行(running):抢占到cpu,运行run()
- 阻塞(blocked):被暂停执行,可能将资源让给其他线程执行
- 死亡(dead):线程销毁
4. 线程优先级
线程优先级1-10;十级最优先
系统默认线程优先级为:5
尽量不要 设置线程优先级太高1
getPriority(); // 返回线程的优先级
setPriority(int); // 设置线程的优先级
5.线程分类
-
用户线程(普通线程)
- 当程序中还有用户线程时,JVM不会停止
- 当程序中仅剩守护线程时,JVM强制停止
-
守护线程
-
如果所剩线程均为守护线程,JVM强制停止
-
守护线程可以在声明时设置
-
守护线程一定是在start() 之前设置
isDaemon() //获取当前线程是否为守护线程 isDaemon(boolean) // 设置线程是否为守护线程 true为是,false为否
-
6.线程休眠sleep
static void sleep(毫秒数) // 让当前执行的线程休眠指定的时间, 让出cpu,进入阻塞状态
// interrupt(); 阻塞线程 如果线程休眠中被阻塞 就会出现异常InterruptException
7. 线程礼让yield
public class Test03 {
public static void main(String[] args) {
// 创建两个线程
Thread01 thread01 = new Thread01();
Thread01 thread02 = new Thread01();
// 给线程名字
thread01.setName("线程1");
thread02.setName("线程2");
// 启动线程
thread01.start();
thread02.start();
// 线程让出 暂停现在执行的线程,重新回到就绪状态抢线程
Thread.yield();
}
}
8. 线程加入join
join() 等待此等待此线程终止
// 一般用于主线程需要用到子线程数据,于是调用子线程的join()等待子线程完成
public final void join() throws InterruptedException {
join(0);
}
9. 线程同步
-
线程并发:多个线程同时修改同一对象或数据时,容易出现线程并发
-
解决方法:添加同步锁,完成线程同步,延长时间,以效率为代价保证数据安全性,java中任何对象都可以作为锁对象
锁是控制线程对共享资源进行访问的工具,通常,锁提供了对资源的独占访问
// 对象必须是同一个
synchronized (Object) {
// 代码块
}