线程(Thread)
是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
关于线程有以下一些知识点
并行:两个事件,在同一时刻都在发生。
并发:两个事件,在同一时间段内都在发生,但是精确到某个时间点,只有一个发生。
进程:正在运行的的程序
线程:进程中完成某个特点的功能的单元
进程与线程的区别
1.线程属于进程,一个进程可以有多个线程,也就是多线程的进程
2.每个进程都有独立的内存空间
3.进程中每个线程拥有独立的栈和堆
线程调度
CPU在多个线程种快速切换,其分为两种:
分时调度:每个线程分配平均的时间
抢占式调度:每个线程随机分配CPU的执行时间
拓展
我们买电脑的时候都听说过处理器,单核处理,双核处理,四核处理,这就是说的可以同时处理几个线程。
有的人问了,那我单核的处理器也可以同时进行好几个线程啊,这是因为CPU在这些线程中进行很快速的切换,人类根本是感觉不出来的,所以以为的是多个线程在进行。
还有就是内存,这是我之前也遇到的情况和大家分享一下,就是好多人说,我的电脑处理器很好,为什么经常死机或者运行东西的时候卡住?这就涉及到内存了,进程在运行的时候是需要占用电脑内存的,这个和硬盘的内存是不一样的,这里说的是运行内存,我之前就是买了个8g的内存条插上之后电脑就变得比以前快好多,所以大家如果有类似的问题可以看看是不是和我一样。
线程类Thread的介绍
构造:
public Thread();不指定线程的名字(线程有默认名字)
public Thread(String name);指定线程名字
public Thread(Runnable target);
public Thread(Runnable target,String name);
成员:
public void run();线程自动执行run,线程的任务代码
public void start();启动线程
public static void sleep(long time);让当前线程"休眠"time毫秒
public static Thread currentThread();获取当前线程对象
获取线程名字的通用方法:
Thread.currentThread().getName();
public String getName();获取线程名字
public void setName(String name); 修改线程名字
创建新的线程方式一
1.继承
2.重写run方法
3.创建子类对象
4.启动子类对象,调用start
//1.继承
public class MyThread extends Thread{
//2.重写run方法
@Override
public void run() {
//循环1
for (int i = 0; i < 100; i++) {
System.out.println("吃饭" + i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
//创建线程对象
MyThread mt = new MyThread();
//调用start方法
mt.start();
//循环2
for (int i = 0; i < 100; i++) {
System.out.println("睡觉" + i);
}
}
}
方式二:
1.创建一个实现类 实现 Runnable
2.实现类 重写 run方法(run里面写任务代码)
3.创建 实现类对象
4.创建Thread对象,并传入实现类对象
5.启动Thread对象
//创建一个实现类 实现 Runnable
public class Runnable implements Runnable {
//实现类 重写 run方法(run里面写任务代码)
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+"..."+i);
}
}
}
public class ImplementsThreadDemo {
public static void main(String[] args) {
//创建一个实现类 实现 Runnable
//实现类 重写 run方法(run里面写任务代码)
//创建 实现类对象
Runnable mr = new Runnable();
//创建Thread对象,并传入实现类对象
Thread t= new Thread(mr,"小明");
//启动Thread对象
t.start();
}
}
两种创建线程方式的比较
实现方式比继承方式好!
1.继承方式只能是单继承,而实现弥补了单继承的不足
2.继承方式线程和任务是紧密相连的,实现方式线程和任务是不需要紧密相连的
3.以后我们用到线程池,能接收任务对象
(Runnable/Callable),不能接收线程对象
综上所述,实现方式比较好,Java也强列推荐使用实现方式创建线程