首页 > 编程语言 >多线程(Java.Thread)学习

多线程(Java.Thread)学习

时间:2024-01-12 23:12:41浏览次数:32  
标签:Java name Thread 线程 new 多线程 public String

多线程(Java.Thread)学习

线程简介:

1、线程是独立执行的路径
2、程序运行时有很多后台进程 比如主线程、young.gc、full.gc()
3、main是主线程,系统入口,用于执行整个程序
4、一个进程中、如果开辟多个线程,线程的运行由调度器安排调度、调度器的先后顺序不能人为干预
5、对同一份资源操作时,会存在资源抢夺问题,需要加入并发控制
6、线程会带来额外的开销,比如cpu调度时间,并发控制开销
7、每个线程在自己的工作内存交互,内存控制不当会造成数据不一致

线程实现:

Thread

/**
 * @Description:TODO
 * @Author:Administrator
 * @Create 2024/1/12
 */
public class ThreadTest extends Thread{
    // 线程入口点
    @Override
    public void run() {
        // 线程体
        for (int i = 0;i<10;i++){
            System.out.println("我在看蒂法....."+i);
        }
    }
    public static void main(String[] args) {
        ThreadTest threadTest = new ThreadTest();
            threadTest.start();//开启线程,不一定立即执行 需要cpu调度
            threadTest.run();//立即执行线程 
        for (int i =0;i<10;i++){
            System.out.println("我在学Java Thread"+i);
        }
    }
}

开启 Thread 线程 下载网图,验证start方法线程执行交给cpu。

public class ThreadTest2 extends Thread {
    private String url;
    private String name;

    public ThreadTest2(String url,String name){
        this.url = url;
        this.name =name;
    }
    @Override
    public void run() {
        WebDownloader webDownloader = new WebDownloader();
        webDownloader.download(url,name);
        System.out.println("下载了文件名为:"+name);
    }
    public static void main(String[] args) {
        ThreadTest2 threadTest1 = new ThreadTest2("https://aistyle.art/assets/files/2023-06-30/1688166112-995353-348703237-145251275241612-1956428239713994473-n.jpg","明日香1.jpg");
        ThreadTest2 threadTest2 = new ThreadTest2("https://bkimg.cdn.bcebos.com/pic/8b13632762d0f703918fecd9c0b1463d269759ee6f28?x-bce-process=image/format,f_auto/resize,m_lfit,limit_1,h_300","明日香2.jpg");
        ThreadTest2 threadTest3 = new ThreadTest2("https://aistyle.art/assets/files/2023-06-30/1688166112-995353-348703237-145251275241612-1956428239713994473-n.jpg","明日香3.jpg");

        threadTest1.start();
        threadTest2.start();
        threadTest3.start();
    }
}
class WebDownloader{
    //
    public void download(String url,String name){
        try{
            FileUtils.copyURLToFile(new URL(url),new File(name));
            System.out.println("下载完成");
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

实现runable接口

public class TestThread3 implements Runnable {
    public static void main(String[] args) {
        TestThread3 testThread3 = new TestThread3();
        new Thread(testThread3).run();

        for (int i = 0; i < 10; i++) {
            System.out.println("我在学习" + i);
        }
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("我在聊天" + i);
        }
    }
}

初识并发问题

package org.example.redisson.JavaThread;

/**
 * @Description:TODO
 * @Author:Administrator
 * @Create 2024/1/12
 */

/**
 * 创建线程方式2:实现runable 接口重写run
 * 执行线程需要啊丢入new Thread(TestThread3)
 * 官方推荐 实现runable接口的方式
 */
public class TestThread4 implements Runnable {

    // 模拟票数
    private int ticketNums = 100;
    @Override
    public void run() {
        while (true){
            // 票剩余0时退出
            if (ticketNums <= 0){
                break;
            }
            // 模拟延时
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            // 对票数加锁
            synchronized ((Object)ticketNums){
                // 再次判断
                if (ticketNums <= 0){
                    break;
                }
                System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums--+"张票");
            }
        }
    }

    public static void main(String[] args) {
        TestThread4 ticket = new TestThread4();

        new Thread(ticket,"陈X华").start();
        new Thread(ticket,"席X辉").start();
        new Thread(ticket,"李X杰").start();
    }
}

callable:

线程状态:

线程同步

线程通信

高级主题

JDK15 Lock

标签:Java,name,Thread,线程,new,多线程,public,String
From: https://www.cnblogs.com/czh4869/p/17961764

相关文章

  • Java浮点数精度问题与BigDecimal详解
    第1章:引言大家好,我是小黑,咱们在日常的Java编程中,经常会遇到处理金融数据的情况,比如计算商品的价格或者处理用户的账户余额。在这些场景下,精确的数值计算就显得尤为重要。这时候,BigDecimal就成了咱们的好帮手。不像普通的float和double类型,BigDecimal提供了非常精确的数值计算。......
  • 1.java概述
    第一章java概述java的主要特点:1.java是面向对象的2.Java语言是健壮的。Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证3.Java语言是跨平台性的。[即:一个编译好的.class文件可以在多个系统下运行,这种特性称为跨平台]4.Java语言是解释型......
  • JVM6(JAVA 四中引用类型)
    强引用在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到JVM也不会回收。因此强引用是造成Java内存泄漏的主要原因之一。软引......
  • Java入门
    目标:掌握类与对象的一些注意事项。1).类名建议使用英文单词,首字母大写,满足驼峰模式,且要有一定的含义,例如:Student2).类中定义的变量称为成员变量(对象的属性),类中定义的方法称为成员方法(对象的行为)。3).成员变量本身存在默认值,一般在定义成员变量时不需要赋初始值。4).一个代码文件中......
  • 京东商品详情API实现实时数据获取的Java代码示例
    在电商行业中,商品详情页是用户了解商品信息、进行购买决策的重要页面。为了提高用户体验和促进销售,电商平台通常会提供商品详情的API接口,以便第三方应用能够实时获取商品数据。本文将介绍如何使用京东获得的JD商品详情API实现实时数据获取,并提供相应的Java代码示例。一、JD商品详......
  • 开发日志(数据结构、时间戳、javaException)
     (一)数据库类型mysql中的datetime可以转为postgres的date(二)数据库时间戳postgresql使用时间戳获取时分秒时间1、selectcurrent_timestamp2024-01-1214:16:31.93339+082、selectcurrent_timestamp(0) //去掉秒后面的位数,但仍有时区2024-01-1214:17:42+083、CURRENT_TIMESTAMP(......
  • Redis分布式锁的Java实现之道
    摘要:在当今的微服务架构中,分布式锁是一个非常重要的概念。它允许我们在多个服务之间同步操作,确保数据的一致性和完整性。而Redis作为一种高性能的内存数据存储系统,常常被用来实现分布式锁。一、分布式锁的基本概念在分布式系统中,多个节点可能同时访问和修改共享资源。如果没有适......
  • Python多线程的限制与使用场景探讨
     Python是一种流行的编程语言,具有内置的多线程支持。然而,由于Python的全局解释器锁(GIL)机制等因素的存在,有人认为Python的多线程在某些情况下可能没有明显的性能优势。本文将探讨Python多线程的限制以及适用的使用场景。 1.GIL对多线程的影响 全局解释器锁(GIL)是Python解释器的......
  • Java医院智慧3D导诊系统源码 小程序源码
    医院智慧3D导诊系统,通过输入疾病症状和选择部位进行导诊挂号,支持小程序端、APP端开发背景人们经常去医院因为不知道挂什么科而烦恼,有些病人不方便问又不好意思问。在互联网医院中挂号且又不知该挂什么科,找什么类型的医生,这些不足,给患者带来了极大的不便,甚至可能严重耽误病情。1......
  • Java set-cooike cookie.setDomain错误
    javacookie.setDomain(".test.com");错误Therewasanunexpectederror(type=InternalServerError,status=500).Aninvaliddomain[.test.com]wasspecifiedforthiscookiepublicvoidsetCookie(HttpServletResponseresponse,Stringtoken){/......