进程:是正在运行的程序
- 是系统进行资源分配和调用的独立单位
- 每一个进程都有它自己的内存空间和系统资源
线程:是进程中的单个顺序控制流,是一条执行路径
继承Thread类的方法实现多线程
步骤:
1.自定义类MyThread继承Thread类
2.MyThread类里面重写run();
为什么是重写run()方法呢?
不是类中的所有代码都需要被线程执行,而这个时候,为了区分那些代码能够被多线程执行,Java提供了Thread类中的run()方法,用来包含那些被线程执行的代码
3.创建对象
4.启动线程
例子:
public class MyThread extends Thread{
//在MyThread类中重写run方法
@Override
public void run() {
for(int i = 0; i < 3; i++) {
System.out.println(this.title + "运行:= " + i);
}
}
public class test {
public static void main(String[] args) {
// 创建线程对象
MyThread my = new MyThread();
//启动线程
my.run();
my.run();
MyThread my = new MyThread();
my.start();
my.start();//IllegalThreadStateException:非法的线程状态异常
//为什么呢?
//因为这是相当于my线程别调用了两次。而不是两个线程的启动
//创建两个线程
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.start();
my2.start();
}
}
Runnable接口的方法实现多线程
Tips:java中类能实现多个接口但最多只能继承一个类
同步方法和同步代码块和Lock锁 同步代码块
有synchronized修饰符修饰的语句块,被该关键词修饰的语句块,将加上内置锁。实现同步。
例:synchronized(Object o ){}
用 synchronized 关键字给针对共享资源进行操作的方法加锁。一个方法使用 synchronized 关键字修饰后,当一个线程A使用这个方法时,其他线程想使用这个方法时就必须等待,直到线程A使用完该方法。
例:
public void sell()—>public synchronized void sell()
注意:
静态同步方法的锁是给该类的 类对象 加锁。
非静态同步方法其实就是给 this对象 进行加锁。
同步是高开销的操作,因此尽量减少同步的内容。
通常没有必要同步整个方法,我们可以选择只同步会发生问题的部分代码而不是整个方法。
Lock锁



