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

Java多线程

时间:2022-12-22 16:47:24浏览次数:37  
标签:Java String Thread start 线程 new 多线程 public

核心概念

  • 线程就是独立的执行路径
  • 在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程。
  • main()称之为主线程,为系统的入口,用于执行整个程序;
  • 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的。
  • 对同一份资源操作时,会存在资源抢夺的问题,需要家人并发控制;
  • 线程会带来额外的开销,如cpu调度时间,并发控制开销
  • 每个线程在自己工作内存交互,存在控制不当会造成数据不一致
  • 线程不一定立即执行,统一听从CPU调度

创建线程

有三种方式可以创建线程

1.继承Thread类

  • 自定义线程类继承Thread
  • 重写run()方法,编写线程执行提
  • 创建线程对象,调用start()方法启动线程
    代码如下
package com.sanduo.annotation;

// 创建线程的方式一:继承Thread类,重写run()方法,调用start开启线程
// 总结:注意,线程开启不一定立即执行,由cpu调度
public class TestThread1 extends Thread{
    @Override
    public void run() {
       // run方法线程
        for (int i = 0; i < 20; i++) {
            System.out.println("我在上厕所");
        }
    }

    public static void main(String[] args) {

        //main线程,主线程

        //创建一个线程对象
        TestThread1 testThread1 = new TestThread1();
        //调用start()方法,开启线程
        testThread1.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("我在吃饭");
        }
    }
}

多线程下载图片

1.导入conmmons-io 包

2.代码分析

package com.sanduo.annotation;

import org.apache.commons.io.FileUtils;

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

// 多线程下载图片
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%2Fup.enterdesk.com%2Fedpic_source%2Fb0%2Fd1%2Ff3%2Fb0d1f35504e4106d48c84434f2298ada.jpg&refer=http%3A%2F%2Fup.enterdesk.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1674289486&t=7147879625e28333af357eb58b8ff16d","美女图片1.jpg");
        TestThread2 t2 = new TestThread2("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fup.enterdesk.com%2Fedpic%2F75%2Fdc%2F50%2F75dc50577d3d3d2bd5fd8db728e7bf77.jpg&refer=http%3A%2F%2Fup.enterdesk.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1674289542&t=703f01845ca443eab8b513921a0b0c8d","美女图片2.jpg");
        TestThread2 t3 = new TestThread2("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic1.win4000.com%2Fm00%2F12%2Feb%2Fa03225e61dbb2f3207c011718b21b6e1.jpg&refer=http%3A%2F%2Fpic1.win4000.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1674289591&t=fae37f917659cc3a2b35418709c0fa05","美女图片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) {
            e.printStackTrace();
            System.out.println("Io异常");
        }
    }
}

2.实现Runnable接口

  • 定义一个类实现Runnable接口
  • 实现run()方法,编写线程执行体
  • 创建线程对象,调用start()方法启动线程
    代码如下
package com.sanduo.annotation;

// 创建线程的方式一:继承Thread类,重写run()方法,调用start开启线程
// 总结:注意,线程开启不一定立即执行,由cpu调度
public class TestThread3 implements Runnable {

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

    public static void main(String[] args) {



        // 创建Runnable实现类对象
        TestThread3 runnable = new TestThread3();
        // 将runnable作为参数,调用Thread有参构造得到线程
        Thread thread = new Thread(runnable);
        thread.start();
        for (int i = 0; i < 200; i++) {
            System.out.println("我在一边吃饭,一边玩手机哈哈哈哈~~"+i);
        }
    }
}

标签:Java,String,Thread,start,线程,new,多线程,public
From: https://www.cnblogs.com/obeigong/p/16999078.html

相关文章

  • JavaScript的this的指向详解
    关于this的指向,主要有一下几个版块,①全局环境下的this指向②函数内的this③对象中的this④箭头函数中的this⑤构造函数中的this⑥原型链中的this【补充一点】关于this,谁调......
  • java入门
    JAVAHelloWorld创建一个文件夹存放代码/java/code新建一个java文件文件后缀名为.javahello.java编写代码publicclassHelloWorld{ publicstaticvoidm......
  • 用JAVA发送含有附件的邮件
    1、用JAVA发送含有附件的邮件publicvoidsendKREmailAndFile(String[]toEmail,StringmailSubject,StringmailContent,List<File>fileList)throwsMessagingExcep......
  • java异常
    1、异常概述(1)异常分为:编译时异常运行时异常(2)编译时异常:javacIDE(,‘’),一般是指的语法错误,比较容易修正(3)运行时的异常:运行错误和逻辑错误1/0;(4)不正常的事件异常的类,创建对......
  • 一、【Java】多线程与高并发
    一、启动多线程的三种方式1、继承Thread接口类实现run()方法staticclassMyThredextendsThread{@Overridepublicvoidrun(){system.out.println("Hellow......
  • javaweb总结4-servlet基础
    正如ASP.NET的核心是IHttpHandler一样,JavaWeb的核心是Servlet接口,位于javax.servlet命名空间中。Filter的概念可以参考ASP.NET的HttpModule,Servlet中的各种Listener可以参......
  • javaweb总结3-Maven Web项目的基本结构
    鉴于目前JavaIDE众多并且都有一定的拥泵,Eclipse的JavaWeb项目不具有可移植性。Maven即解决了项目结构的规范问题又提供了强大引用处理等强大的功能,在项目布局等方面已经......
  • javaweb总结5-自定义Session
    Session在存储安全性要求较高的会话信息方面是必不可少的,Session当然绝对不是用来存储用户登录状态的,但类似验证码等敏感信息却必须存储在Session中。对于分布式Web应用自......
  • javaweb总结1-Java Web 模块结构
    JSP文件和AXPX文件类似,路径和URL一一对应,都会被动态编译为单独class。JavaWeb和ASP.NET的核心是分别是Servlet和IHttpHandler接口,因此无论是基础的Page文件(JSP、ASPX)方式......
  • javaweb总结2-Java Web项目的基本结构[Eclipse Dynamic Web Project]
    EclipseDynamicWebProject项目(1)可以配置需要编译的源码目录和输出目录,默认编译src目录下的源文件到build\classes目录下。(2)可以配置WEB-INF的根目录,默认为WebContent......