一.线程和进程的区别
1.进程:进程是引用程序执行的实例,有独立的内存空间和系统资源。
2.线程:线程是CPU调度和分派的基本单位,进程中执行运算的最小单位,可完成一个独立的顺序控制流程。
二.什么是多线程?
1.如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”。
2.多个线程交替占用CPU资源,而非真正的并行执行
多线程的好处是什么?
- 充分利用CPU的资源
- 简化编程模型
- 带来良好的用户体验
三.如何创建线程?
在Java中创建线程有两中常用方式:
1.继承Thread类:编写简单,可直接操作线程,使用与单继承。
/*
*定义MyThread类继承Thread类
*重写run()方法,编写线程执行体
*创建线程对象,调用start()方法启动线程
*/
public class MyThread extends Thread{
//重写run()方法
public void run(){
for(int i=1;i<100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
//测试类
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); //启动线程}
}
2.实现Runnable接口:避免单继承的局限性,便于共享资源。
/*定义MyRunnable类实现Runnable接口
*实现run()方法,编写线程执行体
*创建线程对象,调用start()方法启动线程
*/
public class MyRunnable implements Runnable{
public void run(){
for(int i=1;i<100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
//测试类
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread myThread = new Thread(myRunnable);
thread.start(); //启动线程}
}
注意:无论是继承Thread还是实现Runnable接口,都需要重写run()方法。Runnable接口中没有start()方法,所有需要创建Thread对象调用start()方法来启动线程。一般情况推荐使用Runnable接口方式创建线程。
3.使用线程的步骤:
四.线程的状态有哪些?
创建状态→就绪状态→运行状态→阻塞状态→死亡状态
五.线程的常用方法(也称之为线程的调度:指按照特定机制为多个线程分配CPU的使用权)
方 法 | 说 明 |
setPriority(int newPriority) | 更改线程的优先级 |
static void sleep(long millis) | 在指定的毫秒数内让当前正在执行的线程休眠 |
void join() | 等待该线程终止 |
static void yield() | 暂停当前正在执行的线程对象,并执行其他线程 |
void interrupt() | 中断线程 |
boolean isAlive() | 测试线程是否处于活动状态 |
六.线程同步的方式
使用synchronized修饰的方法控制对类成员变量的访问。synchronized就是为当前的线程声明一个锁。
1.使用synchronized修饰类,
访问修饰符 synchronized 返回类型 方法名(参数列表){……}
或者
synchronized 访问修饰符 返回类型 方法名(参数列表){……}
2.使用synchronized修饰方法,
public synchronized void sale() {
//代码块
}
3.使用synchronized修饰代码块,
synchronized(syncObject){
//需要同步的代码
}