进程
Process
进程就是操作系统中执行的程序。一个程序就是一个执行的进程实体。
每个运行中的进程,都有属于它独立的内存空间,各个进程互不影响。
线程
Thread
线程是一个进程中的执行单元,一个进程中可以有多个线程。
多个线程,可以访问同一个进程中的资源。
每个线程都有一个独立的栈空间,这些线程所在的栈空间位于同一个进程空间中。
多线程
如果一个进程中,同时在执行着多个线程,就称为多线程。
多线程可以提高程序执行效率。如多个窗口卖票,可以加快卖票的效率。
其实每个执行的
Java
程序,都是多线程执行,
main
方法称为主线程,还有
gc
线程
(
守护线程
)
在同时运行。
并行和并发
并行
各个进程同时执行,称为并行。
并发
多个线程同时执行,称为并发。
同步和异步
同步
所有的任务排队执行,称为同步执行。
异步
在执行任务
A
的同时,执行任务
B
,称为异步执行。
Java中的线程Thread类
实现多线程的方法
方式一:继承Thread类
1.
创建一个类,继承
Thread
类
2.
重写
Thread
类中的
run()
方法
3.
创建自定义的线程子类对象后,调用
start()
方法
自定义
Thread
线程的子类
package com.hqyj.ThreadTest;
/*
* 实现多线程步骤
* 1.成为Thread的子类
* 2.重写run()方法
* 3.创建当前类对象后,调用start()方法
* */
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
//让该线程输出0-99
System.out.println(getName() + ":" + i);
}
}
public MyThread(String name) {
super(name);
}
public MyThread() {
}
}
main类
package com.hqyj.ThreadTest;
public class Test2 {
public static void main(String[] args) {
//创建无参数的自定义线程对象
MyThread t1 = new MyThread();
t1.setName("线程A");
//创建自定义线程对象,参数为线程名
MyThread t2 = new MyThread("线程B");
//让两个线程自动执行,必须调用start()
t1.start();
t2.start();
}
}
方式二:实现Runnable接口
由于Java中是单继承,如果某个类已经使用了extends关键字去继承了另一个类,这时就不能再通过
extends
继承
Thread
实现多线程。
就需要实现
Runnable
接口的方式实现多线程。
1.
自定义一个类,实现
Runnable
接口
2.
重写
run()
方法,将多线程要执行的内容写在该方法中
3.
创建
Runnable
接口的实现类对象
4.
使用构造方法
Thread(Runnable target)
或
Thread(Runnable target
,
String name)
将上一步创建
的
Runnable
实现类对象包装为
Thread
对象
自定义
Runnable
接口的实现类
package com.hqyj.ThreadTest;
/*
* 实现多线程步骤
* 1.成为Runnable的实现类
* 2.重写run()方法
* 3.创建该类对象
* 4.将其包装为Thread对象
* */
public class MyThread2 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
//让该线程输出0-99
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
main类
package com.hqyj.ThreadTest;
public class Test2 {
public static void main(String[] args) {
//创建Runnable接口的实现类
Runnable target = new MyThread2();
//由于启动多线程必须要通过Thread的start()方法,所以一定要创建Thread对象
Thread mt = new Thread(target,"线程A");//这里使用Thread(Runnable target)构
造方法创建Thread对象
//让线程就绪
mt.start();
//创建另一个线程对象,让线程就绪
new Thread(new MyThread2(),"线程B").start();
}
}
死锁的解决方式
方式一
让两个线程获取资源的顺序保持一致。
方式二
让两个线程在获取资源
A
和
B
之前,再获取第三个资源,对第三个资源使用
synchronized
进行同步,这样某个线程在获取第三个资源后,将后续内容执行完毕,其他线程才能开始执行。