1.1 概述 线程介绍
-
多任务
吃饭玩手机,开车打点滴,蹲坑打游戏
现实中太多这样同时做多件事情的例子了,看起来是多个任务都在做,其实本质上我们的大脑在同一时间依旧只做了一件事情。
-
多线程
道路窄,拓宽,多条路
收银,多个收银员
-
程序 进程(process) 线程(thread)
-
说起进程,就不得不说下程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是—个静态的概念。
-
而进程则是执行程序的一次执行过程,它是一个动态的概念。 是系统资源分配的单位
-
通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的的单位。
-
◆线程就是独立的执行路径;
◆在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为的干预的。
◆对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;
◆线程会带来额外的开销,如cpu调度时间,并发控制开销。
◆每个线程在自己的工作内存交互,内存控制不当会造成数据不一致
1.2 线程创建
三种创建方式
Thread:
package com.zishi.lensson1;
?
//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程
public class TestThread1 extends Thread{
?
start()方法 同时进行
testThread1.run();
先执行run()线程
网图下载
package com.zishi.lensson1;
?
import org.apache.commons.io.FileUtils;
?
import java.io.File;
import java.io.IOException;
import java.net.URL;
?
//练习Thread,实现多线程同步下载图片
public class TestThread2 extends Thread{
?
private String url;//网络图片地址
private String name;//保存的文件名
?
public TestThread2(String url, String name) {
this.url = url;
this.name = name;
}
?
//下载图片线程的执行体
Runnable:
package com.zishi.lensson1;
?
//创建线程方式2: 实现Runnable接口,重写run方法,
//执行线程需要丢入runnable接口实现类,调用start方法
public class TestThread3 implements Runnable{
start() 同步进行
Thread 实现了 Runnale
//创建线程对象,通过线程对象来开启我们的线程,代理
// Thread thread = new Thread(testThread3);
// thread.start();
推荐使用Runnable接口
同一个对象被多线程使用 例子:
package com.zishi.lensson1;
?
//多线程同时操作同一个对象
//买火车票的例子
public class TestThread4 implements Runnable{
?
//票数
private int ticketNums = 10;
?
案例:龟兔赛跑
package com.zishi.lensson1;
?
//模拟龟兔赛跑
public class Race implements Runnable{
?
//胜利者
private static String winner;
?