什么是进程?
操作系统中一个程序的执行周期(从打开到关闭)。进程是具有一个或多个线程的线程组。
什么是线程?
- 一个进程可以同时执行多个任务,任务就是线程,一个进程至少有一个线程。
- 线程运行在进程内部,线程是轻量级进程。
进程和线程比较:
- 与进程相比,线程更加轻量级,创建,撤销一个线程比启动、撤销一个进程开销小的多。一个进程中的所有线程共享此进程的所有的资源;
- 没有进程就没有线程,进程一旦终止,其内的线程也不复存在;
- 进程是操作系统资源分配的基本单位,进程可以独享资源;
线程需要依托进程提供的资源,无法独立申请操作系统资源,是操作系统任务执行 (cpu调度) 的基本单位。
多线程的表现:360浏览器可以同时下载多个图片或者响应用户的其他请求;
在高峰期买票时,12306需要同时处理多个客户的请求,但是请求数量过多,也就是访问线程量过多,会导致12306服务器崩溃…
实现多线程
实现多线程有三种方式:
- 继承Thread类实现多线程
- Runable接口实现多线程
- 实现接口Callable来实现多线程(juc)
一:继承Thread类实现多线程
java.lang.Thread 是线程操作的核心类。新建一个线程最简单的方法是直接继承Thread类,而后覆写run( )方法(相当于主线程的main方法)。run是线程的入口方法。
///继承Thread类实现多线程
class Mythread extends Thread
{
private String title;
public Mythread(String title)
{
this.title=title;
}
@Override
public void run() //run是线程的入口,相当于main
{
for(int i=0;i<10;i++)
{
System.out.println(title+" "+ i);
}
}
}
public class Thread1
{
public static void main(String[] args) {
//有3个线程
Mythread thread1=new Mythread("thread1");
Mythread thread2=new Mythread("thread2");
Mythread thread3=new Mythread("thread3");
thread1.run(); //线程直接调用run方法
thread2.run();
thread3.run();
}
}
从结果看出,三个线程顺序打印,并没有实现多线程,是因为实现多线程必须用Thread.start()方法。
任何启动多线程的方式都是调用Thread类中的start()方法。
//Thread类的start方法
public class Thread1
{
public static void main(String[] args) {
Mythread thread1=new Mythread("thread1");
Mythread thread2=new Mythread("thread2");
Mythread thread3=new Mythread("thread3");
thread1.start(); //实现多线程必须用Thread类的start方法
thread2.start();
thread3.start();
}
}
从结果看书,调用start实现了多线程,即同时执行多个任务。
为什么要调用start方法不能直接调用run方法实现多线程?
先看调用Thread.start( )方法实现多线程过程:
Thread.start( )源码:
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0(); //调用start0方法
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}