定义
进程:一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。
线程:是进程中的一个执行流程,是CPU调度执行的基本单位,一个进程中可以运行多个线程;线程有自己的程序计数器、寄存器、堆栈和帧。同一进程中的线程共用相同的地址空间,同时共享进进程锁拥有的内存和其他资源。
分类
线程总体分两类:用户线程和守候线程。
守护线程(damon thread),守护线程在后台运行,提供程序运行时所需的服务。当虚拟机中运行的所有线程都是守护线程时,虚拟机终止运行。
意义
多线程不能提高程序的执行速度,其实是为了提高应用程序的使用率,不让CPU闲置。
程序的执行其实是抢占CPU资源,夺得CUP执行权,如果多进程下的某个进程的执行路径比较多,那么它就会有更高的几率抢到CPU的执行权。多线程只是多并发,并不是真正意义上的并行,多核系统才是真正意义上的并行。
并发:通过CPU调度算法,让用户看上去同时执行,实际上,是通过CPU在高速切换,并不是真正的额同时
并行:多个CPU实例或者多台机器同时执行一段处理逻辑,这就是真正的同时;
实现多线程的几种方式
继承Thread类
public class MyThread extends Thread {
public MyThread(String string) {
super(string);
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 问老师问题 .. ");
/* while(true) {
System.out.println(Thread.currentThread().getName() + " 问老师问题 .. ");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}*/
}
public static void main(String[] args) throws InterruptedException {
MyThread t1 = new MyThread("小明"); // 创建线程对象
MyThread t2 = new MyThread("小红");
t1.start(); // 启动线程
t2.start();
System.out.println(Thread.currentThread().getName() + " is running ... "); // 打印当前线程的名字
Thread.sleep(10000); // 休息10000ms t1,t2得到执行
while (true) {
System.out.println(Thread.currentThread().getName() + " is running ... "); // 打印当前线程的名字
try {
Thread.sleep(10000); // 休息1000ms
} catch (Exception e) {
e.printStackTrace();
}
}
}
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TQYR2aSJDW2A3MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMxkDM1QDMxAjNwcDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
实现Runnable接口
public class MyRunnable implements Runnable {
@Override
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName() + " is running .. ");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MyRunnable tt = new MyRunnable(); // 实例化线程任务类
Thread t1 = new Thread(tt); // 创建线程对象,并将线程任务类作为构造方法参数传入
Thread t2 = new Thread(tt);
t1.start(); // 启动线程
t2.start();
}
}
定时器:可以利用定时器创建定时任务;可以利用框架实现,如:spring的schedule和quartz;也可以用jdk提供的api实现定时任务。
public class TimerDemo {
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
public static void main(String[] args) throws Exception {
Timer timer = new Timer();
/**
* 1.在某个时间点后执行任务
* */
timer.schedule(new TimerTask() {
@Override
public void run() {
String curentTime = format.format(new Date());
System.out.println(curentTime+":定时任务执行了....");
}
}, format.parse("2018-07-05 23:44:00"));
/**
* 2.延时一段时间执行任务
* */
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("五秒后说:欢迎光临.....");
}
}, 5000);
/**
* 3.每隔一段时间执行任务
* */
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("每隔五秒说:欢迎光临.....");
}
}, new Date(),5000);
}
}
、
结合ExecutorService+Callable+Future实现具有返回结果的多线程,可结合线程池框架Executors框架实现。 详见:https://blog.csdn.net/zz_ddup/article/details/79945780