一.进程与线程概述
进程可以直接理解为运行的程序,一个进程可以执行多个线程,线程依赖于进程。
注意:
多进程计算机并不意味着CPU可以同时执行多个任务。事实上,多进程计算机是通过对程序的不断高效切换来让我们感觉CPU是在同时执行多个任务的。
线程分为单线程
和多线程
。多线程即意味着程序有多条路径去执行同一个任务。多线程的本质其实就是为了有更多的机会去获得CPU的执行权。也正是因为这个特点,多线程会存在线程安全问题。多线程的存在,不是为了提高程序的执行速度,而是为了提高应用程序的使用率。
二.多线程的实现方式
1.通过Thread类
具体操作为:继承Thread类,重写run方法,创建Thread子类的实例(即创建了线程对象),调用start方法启动线程。测试代码:
package package03_thread;
public class ThreadDemo01 extends Thread {
//车票数量
private int tickets = 10;
@Override
//重写run方法
public void run() {
while (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "卖出第【" + tickets-- + "】张火车票");
}
}
public static void main(String[] args) {
//调用start方法启动线程
new ThreadDemo01().start();
new ThreadDemo01().start();
new ThreadDemo01().start();
}
}
运行截图:
注意到,Thread方式并没有共享线程之间的数据并且只能单继承Thread类。
2.Runable接口实现
具体实现为:重写run方法,创建Runable实现类的实例,并以此实例传入Thread对象,创建Thread对象,调用start方法启动线程。
测试代码:
package package03_thread;
public class RunableDemo01 implements Runnable{
private int tickets = 10;
@Override
public void run() {
while(tickets > 0) {
System.out.println(Thread.currentThread().getName()+"卖出第【"+tickets--+"】张火车票");
}
}
public static void main(String[] args) {
Runnable runnable = new RunableDemo01();
new Thread(runnable).start();
new Thread(runnable).start();
new Thread(runnable).start();
}
}
运行截图:
该方式实现了数据共享,同时将同一个runable对象交给多个线程去处理,有效地将代码与数据做到了分离。一般情况下这种方式更为常用。
3.线程池实现
测试代码:
package package03_thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class PoolDemo01 implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread());
}
private static int Pool_num = 10;
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < Pool_num; i++) {
PoolDemo01 poolDemo01 = new PoolDemo01();
executorService.execute(poolDemo01);
}
executorService.shutdown();
}
}
运行截图: