基础知识


  • 创建方法

  • 继承Tread class

    • 继承并重写run()方法,启动的时候使用start()启动
    • image.png
  • 继承RunnAble接口
    • 本质和thread的继承很相似
    • 只不过需要实现之后仍丢入Thread类中创建Thread类开启线程
  • 继承Callable接口

    使用实例

    1. 下载器

  • 首先导包:commons-io-2.7.jar
  • 调用时,传入重命名后的名字,还有图片url,下载到当前目录下 ```java package top.aniun; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.net.URL;

public class TestThread2 extends Thread {

  1. private String url;
  2. private String name;
  3. public TestThread2(String name,String url){
  4. this.url = url;
  5. this.name = name;
  6. }
  7. @Override
  8. public void run() {
  9. WebDownLoader webDownLoader = new WebDownLoader();
  10. webDownLoader.downLoader(url,name);
  11. System.out.println("下载了文件名为:"+name);
  12. }
  13. public static void main(String[] args) {
  14. TestThread2 t1 = new TestThread2("1.jpg","https://i1.hdslb.com/bfs/face/2254162161a60b528cfec449f3450409a81ebc37.jpg");
  15. TestThread2 t2 = new TestThread2("2.jpg","https://i1.hdslb.com/bfs/face/2254162161a60b528cfec449f3450409a81ebc37.jpg");
  16. TestThread2 t3 = new TestThread2("3.jpg","https://i1.hdslb.com/bfs/face/2254162161a60b528cfec449f3450409a81ebc37.jpg");
  17. t2.start();
  18. t1.start();
  19. t3.start();
  20. }

}

class WebDownLoader{ //下载方法 public void downLoader(String url,String name){ try { FileUtils.copyURLToFile(new URL(url),new File(name)); } catch (IOException e) { e.printStackTrace(); System.out.println(“IO异常,downloader失败”); } } }

``` ————————————————————————————————————————-
时间:一周
要求:

  • 下面提出的问题以及场景题都需要去思考总结出答案并写在问题下方
  • 要求写代码的就粘贴上自己的代码
  • 其他的可以以文字或画图的形式总结出答案
  • 周报:除了完成以上的任务,需要在末尾写上本周的思考,疑问或遇到的问题,又或有那些新的收获等等….

    一.多线程基础

    在学多线程之前,我们应该思考一个问题,多线程有什么用?为什么要有多线程?

  • 创建多线程的三种方式(Runnable,Callable和Thread)

    • 要求用代码去实现,并输出一条语句
    • 思考三种方式有什么不一样以及三种方式的使用场景
  • 线程的5种状态以及什么场景下会进入这5种状态
  • join,sleep,yield,notify,wait
    • 理解5者的的作用和以及使用场景

我们都知道多线程的操作可能会导致线程安全问题,那么什么情况下会出现线程安全的问题呢?
场景题一:创建两条线程,都同时对一个成员变量a进行100次的++操作,每条线程每次对a加1就打印下a的结果!多次执行并观察a的最终结果有什么不同!
要求:

  1. 用代码实现上面的场景题,写下你的发现以及尝试去分析a的结果为什么会这样子!
  2. 那既然上面的执行有并发问题,那么该如何去解决?加锁?如果要加锁,那又该怎么去实现从而使a的结果正常?有几种解决方法?

其实在真实的开发场景当中,我们使用多线程的时候,并不是一个一个线程的去创建,而是使用线程池的技术,这么去理解这个线程池呢?你就可以简单理解为有很多的线程放在一个集合或数组里面放着,等你要用的时候就拿来用便是,当然具体线程池底层是怎么实现的,要去看源码才清楚。那问题来了:重要,常用)

  • 线程池有什么作用,为什么要有线程池
  • 有几种类型的线程池以及区别
  • 不同类型的线程池用代码去实现

二.多线程进阶

  • 线程间的通信
  • AQS同步器
  • cas

三.原理刨析