一、什么是进程
进程是指运行中的程序、比如我们启动了qq,就启动了一个进程、操作系统就会为该进程分配内存空间。当我们使用迅雷、又启动了一个进程、操作系统将为迅雷分配新的内存空间。
二、什么是线程
1、线程是由进程创建的、是进程的一个实体
2、一个进程可以拥有多个线程
线程其他概念
1、单线程:同一时刻只允许执行一个线程
2、多线程:同一时刻可以执行多个线程、比如:一个qq进程,可以同时打开多个聊天窗口;一个迅雷,可以同时执行多条下载任务
3、并行:在同一时刻,多个处理器同时去执行多条任务叫做并行。
4、并发:在同一时刻,一个处理器去频繁切换执行多条任务叫做并发。
java实现获取cpu数量
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
// 获得当前电脑cpu数量/核心数
int cpuNum = runtime.availableProcessors();
System.out.println("当前cpu的数量为 "+cpuNum);
}
三、线程的创建方式
1、继承Thread类
public class UseThread {
public static void main(String[] args) {
Cat cat = new Cat();
cat.start();
}
}
/**
* 1、当一个类继承了thread类、该类就可以当作线程进行使用
* 2、我们会重写一个run方法,写自己的业务代码
* 3、run Thread类、实现了Runnable 接口的 run 方法
*/
class Cat extends Thread{
int num = 0;
@Override
public void run() {
while(true){
System.out.println("喵喵喵,我是小猫咪 "+(++num));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(num == 8){
break;
}
}
}
}
2、实现Runnable接口
说明:
1、java是单继承的,也就是说,当你的A类已经继承了B类,那么就没有办法使用继承Thread类来实现多线程。
2、这时,java的设计者们提供了另外一种思路,实现Runnable接口来创建线程。
3、启动时,Runnable没有start方法,需要使用静态代理的方式来启动线程。
public class UseThread2 {
public static void main(String[] args) {
Targer targer = new Targer();
Thread thread = new Thread(targer);
thread.start(); // 使用了静态代理的方式实现
}
}
class Targer implements Runnable{
@Override
public void run() {
int num = 0;
while (true){
System.out.println("老虎嗷嗷叫~"+(++num) +"线程名称 "+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(num == 20){
break;
}
}
}
}
四、启动线程为什么是start方法
run方法其实就是一个普通的方法、没有真正的启动一个线程、在main线程里、会将run方法执行完毕、才会执行main方法后的代码。
五、继承Thread和实现Runnable接口的区别
1、从java设计本质上讲,继承thread和实现runnable接口是没有任何区别的、thread也是实现了runnable接口下的thread0()来实现的线程创建
2、实现Runnable接口方式更适合于多个线程共享一个资源的情况、并且避免了单继承的限制、建议使用Runnable接口
网友评论