首页 > 其他分享 >2022/10/12线程核心概念

2022/10/12线程核心概念

时间:2022-10-12 01:11:26浏览次数:42  
标签:10 12 String Thread start 线程 new public

线程核心概念

  • 线程就是独立的执行路径。

  • 在程序运行时,即使自己没有创建线程,后台也会有多个线程,如主线程,gc线程。

  • main()称之为主线程,为系统的入口,用于执行整个程序。

  • 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的

  • 对同一份资源操作时,会存在资源抢夺的问题需要加入并发控制。

  • 对同一份资源操作时,会存在资源抢夺问题,需要加入并发控制。

  • 线程会带来额外的开销,如cpu调度时间,并发控制开销。

  • 每个线程在自己的工作内存交互,内存控制不当造成数据不一致。

三种创建方式

  • Thread class:继承Thread类(重点)

  • Runnable接口:实现Runnable接口(重点)

  • Callable接口:实现Callable接口(了解)

Thread

  • 自定义线程类继承Thread类

  • 重写run()方法,编写线程执行体

  • 创建线程对象,调用start()方法启动线程

public class TestThread1 extends Thread{
   @Override
   public void run() {
       super.run();
       //run放方法线程体
       for (int i = 0; i < 20; i++) {
           System.out.println("我在看代码"+i);
      }

  }

   public static void main(String[] args) {
       //main线程,主线程
       //创建一个线程对象
       TestThread1 testThread1 = new TestThread1();
       //new一个线程对象
       testThread1.start();//调用start方法,开启线程
       for (int i = 0; i < 20; i++) {
           System.out.println("我在学习多线程"+i);

      }
  }
}

 

 

 

public  class TestThread2 extends Thread{
  private String url;
  private String name;
  public TestThread2(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) {
      TestThread2 t1=new TestThread2("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Flmg.jj20.com%2Fup%2Fallimg%2F1114%2F010421143P0%2F210104143P0-4-1200.jpg&refer=http%3A%2F%2Flmg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1668094322&t=1222fed63d4d2315eb80ed377579ec90","1.jpg");
      TestThread2 t2=new TestThread2("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Flmg.jj20.com%2Fup%2Fallimg%2F1114%2F010421143P0%2F210104143P0-4-1200.jpg&refer=http%3A%2F%2Flmg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1668094322&t=1222fed63d4d2315eb80ed377579ec90","2.jpg");
      TestThread2 t3=new TestThread2("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Flmg.jj20.com%2Fup%2Fallimg%2F1114%2F010421143P0%2F210104143P0-4-1200.jpg&refer=http%3A%2F%2Flmg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1668094322&t=1222fed63d4d2315eb80ed377579ec90","3.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) {
          throw new RuntimeException(e);
      }
  }
  }

Runnable

  • 定义MyRunnable类实现Runnable接口

  • 实现run()方法,编写线程执行体

  • 创建线程对象,调用start()方法启动线程

小结

  • 继承Thread类

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

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

    • 不建议使用:避免oop单继承局限性

  • 实现Runnable接口

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

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

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

//多个线程同时操作一个对象
//买火车票的例子
//发现问题:多个线程操作同一个资源时,线程不安全,数据紊乱。
public class TestThread4 implements Runnable{
   private int ticketNums = 10;
   @Override
   public void run() {
       while (true){
           if (ticketNums<0){
               break;
          }
           try {
               Thread.sleep(200);
          } catch (InterruptedException e) {
               throw new RuntimeException(e);
          }
           System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums--+"票");
      }
  }

   public static void main(String[] args) {
       TestThread4 ticket = new TestThread4();
       new Thread(ticket,"小明").start();
       new Thread(ticket,"小红").start();
       new Thread(ticket,"小颜").start();
  }
}

案例

龟兔赛跑

image-20221012003831034

public class Race implements Runnable{
   //胜利者
   public static String winner;
   @Override
   public void run() {
       for (int i = 0; i <=100; i++) {
           //模拟兔子休息
           if (Thread.currentThread().getName().equals("兔子")&&i%10==0){
               try {
                   Thread.sleep(10);
              } catch (InterruptedException e) {
                   throw new RuntimeException(e);
              }
          }
           //判断比赛是否结束
           boolean flag = gameOver(i);
           //如果比赛结束了,停止程序
           if (flag){
               break;
          }
           System.out.println(Thread.currentThread().getName()+"跑了"+i+"步");
      }

  }
   private boolean gameOver(int steps){
       //判断是否完成比赛
       if (winner!=null){
           return true;
      }else if(steps>=100){
           winner=Thread.currentThread().getName();
           System.out.println("winner is"+winner);
           return true;
      }
       return false;
  }

   public static void main(String[] args) {
       Race race = new Race();
       new Thread(race,"兔子").start();
       new Thread(race,"乌龟").start();
       System.out.println("");
  }
}
 

标签:10,12,String,Thread,start,线程,new,public
From: https://www.cnblogs.com/Paytonfei/p/16783151.html

相关文章

  • LeetCode算法笔记 121. 买卖股票的最佳时机
    importjunit.framework.TestCase;publicclassLeetCode03_2extendsTestCase{/***121.买卖股票的最佳时机*给定一个数组prices,它的第i......
  • 多线程
    创建线程继承Thread类创建线程publicclassThread01{publicstaticvoidmain(String[]args){//创建Cat对象,可以当做线程使用Catcat=ne......
  • 算法竞赛入门【码蹄集新手村600题】(MT1101-1150)
    算法竞赛入门【码蹄集新手村600题】(MT1101-1150)文章目录​​算法竞赛入门【码蹄集新手村600题】(MT1101-1150)​​​​前言​​​​为什么突然想学算法了?​​​​为什么选择码......
  • 算法竞赛入门【码蹄集新手村600题】(MT1201-1250)
    算法竞赛入门【码蹄集新手村600题】(MT1201-1250)文章目录​​算法竞赛入门【码蹄集新手村600题】(MT1201-1250)​​​​前言​​​​为什么突然想学算法了?​​​​为什么选择码......
  • 算法竞赛入门【码蹄集新手村600题】(MT1251-1300)
    算法竞赛入门【码蹄集新手村600题】(MT1251-1300)文章目录​​算法竞赛入门【码蹄集新手村600题】(MT1251-1300)​​​​前言​​​​为什么突然想学算法了?​​​​为什么选择......
  • 10.11
    时隔三天没有发,确实一到假期没绷住。主要还是熬夜影响到了第二天。至于今天,是因为课比较多,剩下的时间洗了洗衣服背了背英语,就十点多了。确实很不让人满意。不过不是每天课......
  • 【2022-10-11】DRF从入门到入土(九)
    drf之内置认证类BasicAuthenticationRemoteUserAuthenticationSessionAuthentication:session认证 如果前端带着cookie过来,经过session的中间件,如果登录了,在request.use......
  • 【2022.10.11】drf(9)
    今日内容内置认证类内置权限类内置频率类补充Django的配置文件以及每一个配置文件的作用过滤类的其他使用全局异常处理接口文档1......
  • 从苏宁电器到卡巴斯基第10篇:我在苏宁电器当营业员 II
    之所以是主推,其实是有原因的    据我所知,尽管诺基亚卖的很好,但是他们的厂促的待遇却很一般,估计也就一千多两千的样子,撑死两千多。但是呢,记得当时我们的卖场里面还有......
  • EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)
    在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构:EPROCESS/KPROCESS/PEB。把它们放到一起是因为这三个数据结构及其......