首页 > 编程语言 >java多线程

java多线程

时间:2022-10-28 16:12:52浏览次数:47  
标签:java name Thread 线程 进程 多线程 TestThread2

java多线程学习

1.线程、进程、多线程

进程:
正在进行中的程序,一个程序的执行过程,需要资源:内存、cpu。
线程:
属于进程,指的是一个可以独立运行的代码片段(执行单元、执行路径)。
一个进程中有多个可以独立运行的执行单元,这样的进程称之为多线程的进程。
一个进程中至少有一个线程,这样的进程称之为叫做单线程的进程。
多线程的进程共享同一块内存空间。
CPU在执行时,某一时刻只能执行一个进程,做着高速的切换动作,导致看到的是貌似同时执行的效果(单核)。CPU执行线程的时间是不确定的。抢占式方式抢占CPU的调度。
同类的线程共享堆和方法区资源,但每个线程私有自己的程序计数器、虚拟机栈、本地方法栈。程序计数器私有是为了线程切换后能恢复到正确的位置。而虚拟机栈和本地方法栈私有是为了线程中的局部变量不被其他的线程访问到。

进程是相互独立的,但同一进程的线程可能会相互影响。

并行和并发:
并行:多个任务同时执行,在某一时刻每个任务都在执行,前提–多核。
并发:多个任务同时执行,在某一时刻只有一个任务在执行,其他任务在等待cpu。

2.继承Thread类(创建线程方式一)

创建线程:
java.lang包中有一个Thread对象,用于描述线程事物。
主线程:要运行的代码封装到main方法中的。
子线程:要运行的代码封装到run和call方法中。
1.定义类继承Thread类
2.重写run方法
3.创建子线程对象
4.启动线程,调用start方法

//创建线程方式一:继承Thread类,重写run()方法,主线程调用start()开启线程。注意run与start不同
//总结:线程开启后不一定立即执行,由cpu调度执行

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

    }

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

        //创建一个线程对象
        TestThread1 testThread1 = new TestThread1();

        //调用start开启线程
        testThread1.start();

        for (int i = 0; i < 200; i++) {
            System.out.println("我在学习多线程--"+i);
        }
    }
}

3.网图下载

maven项目导入依赖

<dependencies>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>

自定义下载器

//下载器
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方法出现问题");
        }
    }
}

自定义类继承Thread

//练习Thread,实现多线程同步下载图片
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://img-operation.csdnimg.cn/csdn/silkroad/img/1665732353444.jpg","1.jpg");
        TestThread2 t2=new TestThread2("https://img-home.csdnimg.cn/images/20221021091509.png","2.jpg");
        TestThread2 t3=new TestThread2("https://img-operation.csdnimg.cn/csdn/silkroad/img/1666684204807.png","3.jpg");

        t1.start();
        t2.start();
        t3.start();


    }

}

4.实现Runnable接口

标签:java,name,Thread,线程,进程,多线程,TestThread2
From: https://www.cnblogs.com/hggBolg/p/16836322.html

相关文章

  • Java 根据出生日期计算年龄
    直接上代码:/***根据出生日期,计算用户年龄*@parambirthDay*@return*/publicstaticintgetAgeByBirth(DatebirthDay)throwsParseEx......
  • 【笔记04】Javascript - 基本概念 - (函数)
    【笔记04】Javascript-基本概念-(函数)Javascript 是底层基础,决定上层建筑,这个学不好,后面就学不明白了。函数的诞生先看一段代码:if(1>0){document.write("a");......
  • java-rabbitmq-官网实例02
    java-rabbitmq-官网实例02描述:  1.定义持久化队列,发送持久化消息,消息接受者需要手动应答,MQ才会删除队列中的消息 2.使用channel.basicQos......
  • java-rabbitmq-官网实例01
    java-rabbitmq-官网实例01描述:最简单实例,使用非持久化队列,生产者发布消息,MQ将消息推送给消费者消费,之后MQ在队列中删除该消息依次运行:D1_Send.......
  • java-log4j-xml配置 category、logger、boot 标签使用
    java-log4j-xml配置category、logger、boot标签使用一、节点说明:root:基础日志配置、包括使用的输出器、日志级别等;logger:自定义输出配置;category:自定义输出配置;logger......
  • java-rabbitmq-交换机介绍
    java-rabbitmq-交换机介绍RabbitMQ的四种交换机直连交换机:Directexchange扇出交换机:Fanoutexchange主题交换机:Topicexchange首部交换机:H......
  • java-jsoup-解析html文本
    java-jsoup-解析html文本jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于j......
  • java + springmvc 酷炫验证码分享
    java+springmvc酷炫验证码分享一、maven依赖<!--https://mvnrepository.com/artifact/com.github.bingoohuang/patchca--><!--验证码--><dependency><groupId>com......
  • Java8新特性4:Optional
    1Optional介绍Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。Optional是个容器:它可以保存类型T的值,或者......
  • C#泛型约束,多线程
    定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的几种类型施加限制。如果客户端代码尝试使用约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称......