-
什么是进程?
进程是程序在某个数据集上的执行,是一个动态的实体,它有自己的生命周期。进程反映了一个程序在一定的数据集上运行的全部动态过程。 -
什么是线程?
线程是进程内一个相对独立的、可调度的执行单元,又称为轻量级进程。线程与进程类似,也有运行、就绪、阻塞等状态。线程必须拥有父进程。系统没有为线程分配资源,它与进程中的其他线程共享该进程的共享资源。线程的生命状态图如下:
多线程
多线程意味着一个程序的多个语句块同时进行,但不等于多次启动一个程序。
注意:一个程序至少有两个线程,一个为main线程,另一个为GC线程(垃圾回收线程)。
Java中实现多线程的方式有两种,第一种是生成Thread类的子类,并定义该子类自己的run方法,线程要完成的任务在其run方法中实现。 这种方法比较简单,但是如果定义的类已经是其他的子类,而Java不允许多重继承,我们可以采取第二种方法实现Runnable接口,通过实现Runnable接口中的run方法来实现线程的任务。
构建Thread子类对象
构建Thread子类对象的步骤:
- 构建Thread子类,重现其中的run方法
- 构建线程对象
- 线程对象调用start()方法启动该线程
下面以买票来进行模拟多线程实现:
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("李华卖出" + "------->" + i+"票");
}
}
}
public class Test {
public static void main(String[] args) {
MyThread t =new MyThread();
t.start();
for(int i = 0;i < 5;i++) {
System.out.println("小红卖出------->" + i + "票");
}
}
}
买票结果如下:
用实现Runnable接口对象构建Thread
class MyThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("李华卖出" + "------->" + i+"票");
}
}
}
public class Test {
public static void main(String[] args) {
Runnable r = new MyThread();
Thread t = new Thread(r);
t.start();
for(int i = 0;i < 5;i++) {
System.out.println("小红卖出------->" + i + "票");
}
}
}
用Runnable接口实现,整体结构大同小异,结果依旧能运行:
因为Runnable接口和Thread类之间没有继承关系,不能直接赋值,所以为开启多线程,需要Thread的实例对象对Runnable对象的包装。其中Thread提供线程支持;Runnable实现类提供线程执行体。
线程类Thread常用构造方法
构造方法 | 备注 |
---|---|
String getName() | 获取线程对象名字 |
void setName(String name) | 修改线程对象名字 |
static Thread currentThread() | 获取当前线程对象 |
static void sleep(long millis) | 让当前线程休眠millis毫秒,使当前线程进入休眠,即进入阻塞状态 |
void interrupt() | 终止线程的睡眠 |
int getPriority() | 获得线程优先级 |
void setPriority(int newPriority) | 设置线程优先级 |
最低优先级1,默认优先级是5,最高优先级10,但是优先级只是决定其概率,不存在必然事件 | |
static void yield() | 让位方法,当前线程暂停,回到就绪状态,让给其它线程 |
void join() | 将一个线程合并到当前线程中,当前线程受阻塞,加入的线程执行直到结束 |
synchronized线程同步简述
使用方法:
- 同步代码块
synchronized(线程共享对象){
同步代码块;
}
- 在实例方法上使用synchronized
表示共享对象一定是 this 并且同步代码块是整个方法体。(一个线程访问了synchronized方法,其它线程不能同时访问这个synchronized方法) - 在静态方法上使用synchronized,为类锁