线程的概念:
线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
什么是多线程?
多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。 [1] 在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。
为什么需要多线程?
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。
最简单的比喻多线程就像火车的每一节车厢,而进程则是火车。车厢离开火车是无法跑动的,同理火车也不可能只有一节车厢。多线程的出现就是为了提高效率。同时它的出现也带来了一些问题。
方法一:创建一个类,继承Thread类,并重写run方法
测试类:
@Test
/**
* 将另一个for循环放到 MyThread中执行
* 1 如何开辟分线程 创建一个类 继承 Thread 重写 run方法
* run 方法里面的代码 就是 分线程要执行的代码
* 2 如何让 分线程执行
* 继承 Thread
* 创建该类的对象 MyThread 调用 start();方法
* 注意 不是调用run() 方式
*/
public void test() throws Exception {
long beginTime = System.currentTimeMillis();//记录开始执行的毫秒数
MyThread myThread = new MyThread();
myThread.start(); //开启分线程并执行
for (int i = 0; i < 1000; i++) {
System.out.println("第2个for循环"+i);
}
long endTime = System.currentTimeMillis();//结束执行的毫秒数
System.out.println("执行时间:"+(endTime-beginTime));//主线程执行的时间,不管分线程是否执行完
}
MyThread类:
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+i);
}
}
}
方法二:创建一个类 实现 runnable 接口 重写 run 方法
测试类
@Test
/**
* 1 创建一个类 实现 runnable 接口 重写 run 方法
* 2 实现 runnable 接口 分线程 如何调用
* A 创建该类的对象 A
* B 创建Thread 类对象 并将 A 通过构造函数 赋值给 Thread
* C 调用 thread 类 对象的start方法
*/
public void test3() throws Exception {
long beginTime = System.currentTimeMillis();//记录开始执行的毫秒数
MyThread2 myThread = new MyThread2();
Thread thread = new Thread(myThread);
thread.start(); //开启分线程并执行
for (int i = 0; i < 1000; i++) {
System.out.println("第2个for循环"+i);
}
long endTime = System.currentTimeMillis();//结束执行的毫秒数
System.out.println("执行时间:"+(endTime-beginTime));
}
MyThread2类:
public class MyThread2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("第1个for循环"+i);
}
}
}
方法三:
@Test
public void test5() throws Exception {
long beginTime = System.currentTimeMillis();//记录开始执行的毫秒数
FutureTask task = new FutureTask(new Callable() {
@Override
public Object call() throws Exception {
for (int i = 0; i < 1000; i++) {
System.out.println("第1个for循环"+i);
}
return null;
}
});
new Thread(task).start();
for (int i = 0; i < 1000; i++) {
System.out.println("第2个for循环"+i);
}
}
long endTime = System.currentTimeMillis();//结束执行的毫秒数
System.out.println("执行时间:"+(endTime-beginTime));