多线程
并发和并行
并发: 两个事件在同一"时刻"同时进行
并行: 两个事件在同一"时间段"同时进行
进程和线程
进程: 在内存中正在执行的程序(任务管理器里的每一行程序都算一个进程)
线程: 在进程中拥有独立功能的执行单元.一般完成某项操作(360杀毒软件扫描和杀毒就是杀毒软件进程中的两个线程)
线程调度: CUP的线程调度: CPU 会在多个线程之间,.进行快速切换,快到人根本感觉不出来,以为多个线程同时都在执行,实际上这多个线程是在并发执行.
分类:
a. 分时调度: 每个线程平均分配CPU运行时间
b. 抢占式调度: 每个线程随机分配CPU的运行时间
java 程序采用抢占式调度,所以多个线程每次运行的结果可能是不一样的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S1j3wnpn-1592724559723)(E:\网课\就业班课程\day11多线程-1\day11【多线程】\day11【多线程】\img\image-20200420094313653.png)]
Thread类的介绍
a.Thread类是什么?
Thread类就代表Java中的线程类
b.Thread类的构造方法
public Thread(); 无参构造,线程具有默认名字,默认是Thread-0,THread-1,....
public Thread(String name);带有线程名字的构造方法
public Thread(Runnable r);带有线程任务的构造方法
public Thread(Runnable r,String name);带有线程任务和线程名字的构造方法
c.Thread类的常用方法
public void start();启动"当前"线程
public void run(); 线程写任务代码的地方
public String getName(); 获取当前线程的名字
public void setName(String name); 修改当前线程的名字
public static void sleep(long miliis); 让"当前"线程"暂停"miliis毫秒
注意:这里的"当前"线程是指,Thread.sleep(毫秒值);这句代码所在的线程
public static Thread currentThread(); 获取"当前"线程对象
注意: 这里的"当前"线程是指,Thread.currentThread();这句代码所在的线程对象
创建线程的方式
a.继承方式 创建 线程类 继承Thread
重写 run() 方法
该类对象调用start()方法
b.实现Runnable方式 创建线程类.
创建Runnable实现类 ,实现类中重写run()方法
将实现类对象传入线程类中
c. 实现Callable方式
步骤1:创建实现Callable接口的类SomeCallable<Integer>(略);
步骤2:创建一个类对象:
Callable<Integer> oneCallable = new SomeCallable<Integer>();
步骤3:由Callable<Integer>创建一个FutureTask<Integer>对象:
FutureTask<Integer> oneTask = new FutureTask<Integer>(oneCallable);
//FutureTask<Integer>是一个包装器,它通过接受Callable<Integer>来创建,它同时实现了Future和Runnable接口。
步骤4:由FutureTask<Integer>创建一个Thread对象:
Thread oneThread = new Thread(oneTask);
实现方式 比 继承方式好!!
a.实现方式 弥补了 单继承的不足
b.实现方式更加灵活,继承方式高耦合
c.继承方式不合符低耦合编程思想,而实现方式线程对象和任务对象是由程序员来组合,体现低耦合的思想
综上所述,Java强烈建议使用实现方式!!!
d.Callable 方式会有返回值