多线程---Thread和Runnable

多线程

参考视频:多线程02:线程、进程、多线程哔哩哔哩bilibili

1.概念

 

 

 

 

 

2.线程创建

创建线程方式一:继承Thread类,重写run()方法,调用start开启线程

package com.mokuiran.thread;

public class Demo extends Thread {
   @Override
   public void run() {
       //run方法线程体
       for (int i = 0; i < 20; i++) {
           System.out.println("我在玩游戏!!!"+i);
      }
  }

   public static void main(String[] args) {
       //main线程,主线程

       //创建一个线程对象
       Demo demo = new Demo();

       //调用start()方法开启线程
       demo.start();
       for (int i = 0; i < 200; i++) {
           System.out.println("我在学习!!!"+i);
      }
  }
}
//注意:线程的开启不一定立即执行,由CPU调度执行

创建线程方式一:实现Runnable接口

package com.mokuiran.thread;

public class RunnableDemo implements Runnable {
   @Override
   public void run() {
       //run方法线程体
       for (int i = 0; i < 20; i++) {
           System.out.println("我在玩游戏!!!"+i);
      }
  }

   public static void main(String[] args) {
       //main线程,主线程

       //创建runnable接口的实现类对象
       RunnableDemo runnableDemo = new RunnableDemo();

       //创建线程对象,通过线程对象来开启我们的线程,代理
       Thread thread = new Thread();
       thread.start();
       for (int i = 0; i < 200; i++) {
           System.out.println("我在学习!!!"+i);
      }
  }
}

image-20220904201404286

总结

继承Thread类

  • 子类继承Thread类具备多线程能力

  • 启动线程:子类对象.start()

  • 不建立使用:避免OOP单继承局限性

实现Runnable接口

  • 实现接口Runnable具有多线程能力

  • 启动线程:传入目标点对象+Thread对象.start()

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

注意:两个方法的输出结果都是交替输出,线程之间并无先后顺序。

案例一:

实现多线程同步下载图片:

package com.mokuiran.thread;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;

//实现多线程同步下载图片
public class Demo2 extends Thread{
   private String url;//网络图片的地址
   private String name;//保存的文件名

   public Demo2(String url, String name){
       this.url = url;
       this.name = name;
  }

   @Override
   public void run() {
       WebDownLoader webDownLoader = new WebDownLoader();
       webDownLoader.downloader(url,name);
       System.out.println("下载的文件名:"+name);
  }

   public static void main(String[] args) {
       Demo2 demo2 = new Demo2("https://img2022.cnblogs.com/blog/2941481/202207/2941481-20220730105748137-1136505936.png","代码.png");
       demo2.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()方法出现问题");
      }
  }
}
 
posted @   默夔然  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示