一、进程、线程、多线程
1.进程:
- 是系统中正在运行的一个程序,程序一旦运行就是一个进程;
- 是系统资源分配的独立实体,每个进程都拥有独立的地址空间;
- 一个进程无法访问另一个进程的变量和数据结构
2.线程:
- 是进程的一个实体;
- 是进程的一条执行路径;
3.进程与线程的区别:
- 进程是资源分配最小单位,线程是程序执行最小单位;
- 进程有独立的地址空间,每启动一个进程,系统都会分配一个地址空间,
而线程没有独立的地址空间,它使用相同的地址空间来进行数据共享; - CPU切换一个线程比切换进程花费小;
- 线程占用资源比进程少很多;
- 线程之间可以共享数据,而进程不能;
4.多线程:
多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发
二、run()和start()方法的区别
1.run()方法:
run()方法当做普通方法的方式调用。程序还是要顺序执行,等待run方法体代码执行完毕后,才可以继续执行下面的代码;程序中只有主线程这一个线程,程序执行路径只有一条。
2.start()方法:
此时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;**通过Tread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。**等待run()方法运行结束,此线程终止。
实现线程的两种常用方法
1.继承Thread类
//自定义线程类
public class ThreadDemo extends Thread {
public ThreadDemo(){
}
public ThreadDemo(String name){
super(name);
}
@Override
public void run() {
for(int i = 0; i < 6; i++){
System.out.println("线程启动:"+Thread.currentThread().getName()+i);
}
}
}
//主函数
public static void main(String[] args) {
/*
当使用run()开启线程的时候,只使用主线程这一个线程
*/
//创建2个子线程
ThreadDemo td1 = new ThreadDemo("jhh");
ThreadDemo td2 = new ThreadDemo("whh");
//开启线程(然后会调用线程中的run方法体,run方法体运行完,线程结束)
td1.start();
td2.start();
}
2.实现Runnable接口:
//自定义类实现Runnable接口
public class RunnableDemo implements Runnable {
@Override
public void run() {
for(int i = 0; i < 10; i++){
System.out.println("线程启动:"+Thread.currentThread().getName() +"---->"+i);
}
}
}
public static void main(String[] args) {
// 创建线程
RunnableDemo rd = new RunnableDemo();
// 将创建的线程作为参数传递给Thread
Thread th = new Thread(rd);
RunnableDemo rd2 = new RunnableDemo();
Thread th2 = new Thread(rd2);
th.start();
th2.start();
}