线程

  • 一个进程中若开辟多个线程,线程的运行由调度器控制,先后顺序不能人为干预。

  • 实现方式

    1. 继承 Thread类

      • 调用run方法,只有主线程一条路

      • 调用start方法,主线程和子线程并行交替执行

      • public class MyThread extends Thread{
        
            @Override
        public void run() {
        for (int i = 0; i < 20; i++) {
        System.out.println("xixi");
        }
        } public static void main(String[] args) { MyThread myThread = new MyThread();
        //myThread.run();只有主线程一条路,先xixi后haha
        //开启线程,不一定立刻执行,由cpu调度
        myThread.start();//同时运行,xixi、haha交替 //main线程
        for (int i = 0; i < 20; i++) {
        System.out.println("haha");
        }
        } }
      • 导入common-io.jar下载图片

        import org.apache.commons.io.FileUtils;
        
        import java.io.File;
        import java.io.IOException;
        import java.net.URL; public class MyThread2 extends Thread{ private String url;
        private String name; public MyThread2(String url, String name){
        this.name = name;
        this.url = url;
        } @Override
        public void run() {
        WebDownloader webDownloader = new WebDownloader();
        webDownloader.downloader(url, name);
        System.out.println("下载了文件名为" + name); } public static void main(String[] args) {
        MyThread2 t1 = new MyThread2("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg", "csgo1.jpg");
        MyThread2 t2 = new MyThread2("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg", "csgo2.jpg");
        MyThread2 t3 = new MyThread2("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg", "csgo3.jpg"); t1.start();
        t2.start();
        t3.start(); }
        } 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("downloader异常");
        } finally {
        }
        }
        }
    2. 实现Runnable接口

      • 推荐使用,避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

      public class MyThread3 implements Runnable{
      @Override
      public void run() {
      for (int i = 0; i < 20; i++) {
      System.out.println("xixi");
      }
      } public static void main(String[] args) { //创建实现runnable接口的类对象
      MyThread3 myThread3 = new MyThread3();
      //创建线程对象,通过线程对象启动线程,代理
      new Thread(myThread3).start(); for (int i = 0; i < 20; i++) {
      System.out.println("haha");
      }
      }
      }
      • 多线程同时操作一个对象

        public class MyThread4 implements Runnable{
        
            private int ticketNums = 10;
        
            @Override
        public void run() {
        while (true){
        if(ticketNums <= 0)
        break; //模拟延时
        try {
        Thread.sleep(20);
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "张票");
        }
        } public static void main(String[] args) {
        MyThread4 myThread4 = new MyThread4();
        new Thread(myThread4, "haha").start();
        new Thread(myThread4, "xixi").start();
        new Thread(myThread4, "hehe").start(); } }
        //多个线程操作同一个资源时,线程不安全,数据紊乱
        /*
        haha拿到了第9张票
        xixi拿到了第8张票
        hehe拿到了第10张票
        hehe拿到了第6张票
        xixi拿到了第7张票
        haha拿到了第5张票
        hehe拿到了第4张票
        haha拿到了第4张票
        xixi拿到了第4张票
        xixi拿到了第2张票
        hehe拿到了第3张票
        haha拿到了第1张票
        */
    3. 实现Callable接口

      • 可以定义返回值、可以抛出异常

      • import org.apache.commons.io.FileUtils;
        
        import java.io.File;
        import java.io.IOException;
        import java.net.URL;
        import java.util.concurrent.*; public class MyCallable implements Callable<Boolean> { private String url;
        private String name; public MyCallable(String url, String name){
        this.name = name;
        this.url = url;
        } @Override
        public Boolean call() throws Exception {
        WebDownloader webDownloader = new WebDownloader();
        webDownloader.downloader(url, name);
        System.out.println("下载了文件名为" + name);
        return true;
        } public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallable t1 = new MyCallable("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg", "csgo1.jpg");
        MyCallable t2 = new MyCallable("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg", "csgo2.jpg");
        MyCallable t3 = new MyCallable("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3246675119,2528014287&fm=26&gp=0.jpg", "csgo3.jpg"); //创建执行服务
        ExecutorService ser = Executors.newFixedThreadPool(3); //提交执行
        Future<Boolean> r1 = ser.submit(t1);
        Future<Boolean> r2 = ser.submit(t2);
        Future<Boolean> r3 = ser.submit(t3); //获取结果
        boolean rs1 = r1.get();
        boolean rs2 = r2.get();
        boolean rs3 = r3.get(); //关闭服务
        ser.shutdown();
        } } 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("downloader异常");
        } finally {
        }
        }
        }
  • 静态代理

    • 真实对象和代理对象都要实现同一个接口

    • 代理对象要代理真实角色

    • 代理对象可以做很多真实对象做不了的事情

    • 真实对象专注做自己的事情

    • public class StaticProxy {
      public static void main(String[] args) { You you = new You(); //代理真实对象runnable
      new Thread(()-> System.out.println("haha")).start(); //代理真实对象you
      new WeddingCompany(new You()).HappyMarry(); WeddingCompany weddingCompany = new WeddingCompany(you);
      weddingCompany.HappyMarry();
      }
      } interface Marry{
      void HappyMarry();
      } //真实角色
      class You implements Marry{
      @Override
      public void HappyMarry() {
      System.out.println("marry!");
      }
      } //代理角色
      class WeddingCompany implements Marry{ private Marry target; public WeddingCompany(Marry target){
      this.target = target;
      } @Override
      public void HappyMarry() {
      before();
      this.target.HappyMarry();//真实对象
      after();
      } public void before() {
      System.out.println("before marry");
      }
      public void after() {
      System.out.println("after marry");
      }
      }

java线程实现的三种方式以及静态代理的更多相关文章

  1. java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService

    前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...

  2. java核心知识点----创建线程的第三种方式 Callable 和 Future CompletionService

    前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...

  3. 如何实现有返回值的多线程 JAVA多线程实现的三种方式

    可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable ...

  4. IOS 多线程,线程同步的三种方式

    本文主要是讲述 IOS 多线程,线程同步的三种方式,更多IOS技术知识,请登陆疯狂软件教育官网. 一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IO ...

  5. java 获取时间戳的三种方式

      java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMi ...

  6. Java 实现线程安全的三种方式

    一个程序在运行起来的时候会转换成进程,通常含有多个线程. 通常情况下,一个进程中的比较耗时的操作(如长循环.文件上传下载.网络资源获取等),往往会采用多线程来解决. 比如显示生活中,银行取钱问题.火车 ...

  7. [OpenSource]浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个 ...

  8. 浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份 额,不管谁对谁错,Java和.Net是目前应用开发的两 ...

  9. java 实现websocket的三种方式

    Java中实现websocket常见有以下三种方式: 使用tomcat的websocket实现,需要tomcat 7.x,JEE7的支持. 使用spring的websocket,spring与webs ...

随机推荐

  1. K8S(13)监控实战-部署prometheus

    k8s监控实战-部署prometheus 目录 k8s监控实战-部署prometheus 1 prometheus前言相关 1.1 Prometheus的特点 1.2 基本原理 1.2.1 原理说明 ...

  2. Chapter Zero 0.1.1 计算机硬件五大单元

    计算机硬件的五大单元 先从CPU说起,CPU的全称如下: 中央处理器(Central Processing Unit,CPU) CPU作为一个特定功能的芯片,内含微指令集, 主机的功能差异,主要参考C ...

  3. MarkDown语法详解

    MarkDown语法详解 编辑器:Typora 下载官网:https://typora.io 提速镜像:https://gitee.com/typora-mirror/Typora-Mirror/re ...

  4. python类属性和对象属性、类的普通方法和静态方法

    类属性和对象属性的定义 class LearnClass(): #类属性 cls_attr = None def __init__(self,arg): #对象属性 self.obj_attr = a ...

  5. Linux 驱动框架---驱动中的异步

    异步IO是对阻塞和轮询IO的机制补充,所谓异步IO就是在设备数据就绪时主动通知所属进程进行处理的机制.之所以说是异步是相对与被通知进程的,因为进程不知道也无法知道什么时候会被通知:这一机制非常类似于硬 ...

  6. 比起USDT,我为什么建议你选择USDN

    2018年1月16日,USDT(泰达币)进入了很多人的视野.因为在这一天,在全球价值排名前50的加密货币中,包括比特币.莱特币以及以太坊在内的大多数的数字虚拟加密货币都遭遇了价格大幅下跌,只有泰达币价 ...

  7. [转]ROS中使用message_filters进行多传感器消息同步

    转:http://www.rosclub.cn/post-1030.html 最近实验室老师在做一个多传感器数据采集实验,涉及到了消息同步.所以就学习了ROS官网下的消息同步工具message_fil ...

  8. 云服务器Centos7部署Tomcat服务器

    目录 部署Tomcat服务器 1.安装JDK1.8 2.安装与启动tomcat 配置安全组(8080端口) 参考文章 部署Tomcat服务器 1.安装JDK1.8 JDK下载地址:https://ww ...

  9. GridSearchCV网格搜索得到最佳超参数, 在K近邻算法中的应用

    最近在学习机器学习中的K近邻算法, KNeighborsClassifier 看似简单实则里面有很多的参数配置, 这些参数直接影响到预测的准确率. 很自然的问题就是如何找到最优参数配置? 这就需要用到 ...

  10. C#如何防止程序多次运行的技巧(精典)

    一.引言最近发现很多人在论坛中问到如何防止程序被多次运行的问题的,所以这里就记录下来,希望给遇到同样问题的朋友有所参考的,同时也是对自己的一个积累.在介绍具体实现代码之前,我们必须明确解决这个问题的思 ...