多线程
基本概念
- 程序:指令和代码的有序集合,本身没有任何运行的概念,是一个静态概念;
- 进程:执行程序的一次过程,是一个动态概念,如腾讯视频,qq等;
- 线程:一个进程包含多个线程,如腾讯视频进程可以包含声音,画面,文字等线程,多线程得有多个cpu;
核心概念
- 线程就是独立的执行路径
- 在程序运行时,即使没有自己创建线程,后台也会有多个线程,比如主线程,GC线程
- main()称之为主线程,为系统的入口,用于执行整个程序
- 在一个进程中,如果开辟了多个线程,线程的运行是由调度器安排调度的,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的
- 对同一份资源操作时mm会存在资源抢夺的问题,需要加入并发控制
- 线程会带来额外的开销,如CPU调度时间,并发控制开销
- 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致
多线程创建
- 继承Thread类,重写
run()
方法,创建线程,通过start()
方法开启线程;
注
:静态代理模式 狂神说例子
public class TreadTest extends Thread{
// 在run()方法中执行线程
@Override
public void run() {
System.out.println("run run");
}
public static void main(String[] args) {
TreadTest test = new TreadTest();
// start()方法开启线程
test.start();
System.out.println("main main");
}
}
- 实现Runnable接口,重写
run()
方法,编写线程执行体,创建线程对象,将Runnable接口实现对象作为参数写进线程对象,用start()
方法开启线程;
public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("run run");
}
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
System.out.println("main main");
}
}
- 实现Callable接口,重写call方法,创建执行服务,提交执行,获取结果;
public class TestCallable implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
System.out.println("创建成功");
return true;
}
public static void main(String[] args) {
TestCallable callable = new TestCallable();
//创建执行服务
ExecutorService service = Executors.newFixedThreadPool(1);
//提交执行
Future<Boolean> result = service.submit(callable);
//获取结果
boolean isTrue = result.get();
service.shutdownNow();
}
}