线程定义:
线程是操作系统能够进行运算调度的最小单位,它被包含在系统进程中,是进程中的实际运作单位;
多线程:
多线程是值从软件或者硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能;
简单来说,线程是程序中一个单一的顺序控制流程;而多线程就是单个程序中同时运行多个线程来完成不同的工作;
多线程是为了同步完成多个任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。多线程是在同一时间需要完成多项任务的时候实现的。
多线程的优缺点
优点:
- 多线程可以加快程序的运行速度,使程序的响应速度更快,因为用户界面可以在进行其他工作的时候一直处于活动状态;
- 可以把占据长时间的程序中的任务放到后台去处理,同时执行其他操作,提高效率;
- 当前没有进行处理的任务时可以将处理时间让给其他任务;
- 可以让同一程序的其他不同部分并发执行,释放一些珍贵的资源如内存占用等;
- 可以随时停止任务
- 可以设置各任务的优先级以及优化性能
缺点:
- 因为多线程需要开辟内存,而且线程切换需要时间,因此会消耗系统内存;
- 线程的终止会对程序产生影响;
- 由于多个线程之间存在数据共享,因此容易出现线程死锁的情况;
- 对线程进行管理需要额外的内存cpu开销,线程的使用会给系统带来上下文切换的额外负担;
并行与并行:
并行:是指两个或者多个事件在同一时刻发生(同时发生 );
并发:是指两个或者多个事件在同一时段内发生;
线程和进程区别:
进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多 个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创 建、运行到消亡的过程。
线程:进程内部的一个独立执行单元;一个进程可以同时并发的运行多个线程,可以理解为一个进程便相当 于一个单 CPU 操作系统,而线程便是这个系统中运行的多个任务。
多线程的三个简单实现方法:
/**
* 1. 自定义类继承 Thread (线程类) , 重写run方法 ,没有返回值
* run() 方法内部 ,写入逻辑代码
*/
public class ThreadDemo extends Thread{
@Override
public void run() {
System.out.println("Word");
}
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
td.run();
System.out.println("Hello");
ThreadDemo td1 = new ThreadDemo();
td1.start();
}
}
/**
* 2. 自定义类 实现接口 Runnable接口类 , 重写run方法 ,没有返回值
* run() 方法内部 ,写入逻辑代码
*/
public class RunnableDemo implements Runnable{
@Override
public void run() {
System.out.println("runnable线程运行");
}
public static void main(String[] args) {
RunnableDemo rd = new RunnableDemo();
rd.run();
RunnableDemo rd1 = new RunnableDemo();
rd1.run();
}
}
/**
* 3. 自定义类 实现 Callable接口 , 重写 call()方法 ,并且有返回值
*/
public class CallableDemo implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int i = 0;
for (; i <5; i++) {
if(i<5){
System.out.println("callable线程运行了"+i+"次");
}
}
return i;
}
public static void main(String[] args) {
CallableDemo cd = new CallableDemo();
FutureTask<Integer> ft = new FutureTask<>(cd);
for (int i = 0; i <5 ; i++) {
System.out.println(i);
}
try {
Integer in =ft.get();
System.out.println(in);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}