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

Java多线程

时间:2024-04-07 22:58:05浏览次数:32  
标签:Java String Thread url new 多线程 public name

Process 进程 系统资源分配的单位

Thread 线程 CPU调度和执行的单位

1.继承Thread类

package demo01;

//创建线程 方式一:继承Thread类,重写run()方法,调用start开启线程
//线程开启不一定立即执行,由cpu调度

public class TestThread1 extends Thread{
    @Override
    public void run(){
        //run 方法线程体
        for (int i = 0; i < 2000; i++) {
             System.out.println(i);
    }

    }

    public static void main(String[] args){
        //创建对象
        TestThread1 test = new TestThread1();
        //调用start方法开启线程
        test.start();

        //main线程,主线程
        for (int i = 0; i < 2000; i++) {
            System.out.println("main" + i);
        }
    }
}


2.网图下载

package demo01;

import org.apache.commons.io.FileUtils;

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

//练习Thread实现多线程同步下载图片
public class TEstThread2 extends Thread{
    private String url;
    private String name; //保存的文件名
    public TEstThread2(String url,String name){
        this.url=url;
        this.name=name;
    }

    //重写了run方法
    //下载图片线程的执行体
    @Override
    public void run(){
        WebDownloader webDownloader=new WebDownloader();
        webDownloader.downloader(url,name);
        System.out.println("下载了"+name);
    }

    public static void main(String[] args) {
        String url = "/i/ll/?i=1e3f94eab25a42e3bcb55aafcbfc21cf.png";

        TEstThread2 t1=new TEstThread2(url,"1.png");

        TEstThread2 t2=new TEstThread2(url,"2.png");

        TEstThread2 t3=new TEstThread2(url,"3.png");

        //调用start方法开启线程
        t1.start();
        t2.start();
        t3.start();

    }
}

//下载器
class WebDownloader{
    //下载方法
    public void downloader(String url,String name){
        try {
            //把一个url变成一个文件
            FileUtils.copyURLToFile(new URL(url),new File(name));
        }catch (IOException e){
            e.printStackTrace();
            System.out.println("下载失败");
        }
    }
}


3.Runnable接口

package demo01;

import org.apache.commons.io.FileUtils;

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

//练习Thread实现多线程同步下载图片
public class TEstThread2 extends Thread{
    private String url;
    private String name; //保存的文件名
    public TEstThread2(String url,String name){
        this.url=url;
        this.name=name;
    }

    //重写了run方法
    //下载图片线程的执行体
    @Override
    public void run(){
        WebDownloader webDownloader=new WebDownloader();
        webDownloader.downloader(url,name);
        System.out.println("下载了"+name);
    }

    public static void main(String[] args) {
        String url = "/i/ll/?i=1e3f94eab25a42e3bcb55aafcbfc21cf.png";

        TEstThread2 t1=new TEstThread2(url,"1.png");

        TEstThread2 t2=new TEstThread2(url,"2.png");

        TEstThread2 t3=new TEstThread2(url,"3.png");

        //调用start方法开启线程
        t1.start();
        t2.start();
        t3.start();

    }
}

//下载器
class WebDownloader{
    //下载方法
    public void downloader(String url,String name){
        try {
            //把一个url变成一个文件
            FileUtils.copyURLToFile(new URL(url),new File(name));
        }catch (IOException e){
            e.printStackTrace();
            System.out.println("下载失败");
        }
    }
}


package demo01;

import org.apache.commons.io.FileUtils;

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

//练习Thread实现多线程同步下载图片
public class RunnableThread2 implements Runnable{
    private String url;
    private String name; //保存的文件名
    public RunnableThread2(String url,String name){
        this.url=url;
        this.name=name;
    }

    //重写了run方法
    //下载图片线程的执行体
    @Override
    public void run(){
        WebDownloader1 webDownloader=new WebDownloader1();
        webDownloader.downloader(url,name);
        System.out.println("下载了"+name);
    }

    public static void main(String[] args) {
        String url = "/i/ll/?i=1e3f94eab25a42e3bcb55aafcbfc21cf.png";

        RunnableThread2 t1=new RunnableThread2(url,"1.png");

        RunnableThread2 t2=new RunnableThread2(url,"2.png");

        RunnableThread2 t3=new RunnableThread2(url,"3.png");

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


//        //调用start方法开启线程
//        t1.start();
//        t2.start();
//        t3.start();


    }
}

//下载器
class WebDownloader1{
    //下载方法
    public void downloader(String url,String name){
        try {
            //把一个url变成一个文件
            FileUtils.copyURLToFile(new URL(url),new File(name));
        }catch (IOException e){
            e.printStackTrace();
            System.out.println("下载失败");
        }
    }
}


在这里插入图片描述

4.初时并发问题

package demo01;

//多个线程同时操作同一个对象
//买火车票的例子

//发现问题 多个线程操作同一个资源的情况下,线程不安全,数据紊乱 
public class TestThread4 implements Runnable {

    //票数
    private int ticketNums = 10;

    @Override
    public void run(){
        while(true){
            if (ticketNums <= 0){
                break;
            }

            //模拟延时
            try {
                Thread.sleep(100);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ticketNums--);
        }
    }

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

         new Thread(ticket,"1a").start();
         new Thread(ticket,"2a").start();
         new Thread(ticket,"3a").start();
    }

}

5.龟兔赛跑

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

package demo01;

//模拟龟兔赛跑
public class Race implements Runnable {

    //胜利者
    private static String winner;

    @Override
    public void run(){
        for (int i = 0; i <  1000; i++) {

            //模拟兔子休息
            if (Thread.currentThread().getName().equals("兔子") && i % 10 == 0)
            {
                try {
                    Thread.sleep(100);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
            //判断比赛是否结束
            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();

    }
}

Static 代理

package demo02;

public class StaticProxy {

    public static void main(String[] args) {

        You you = new You();

        new Thread(() -> System.out.println("")).start();

        new WeddingCompany(new You()).HappyMarry();


//        WeddingCompany weddingCompany = new WeddingCompany(you );
//        weddingCompany.HappyMarry();
    }

}

interface Marry{
    void HappyMarry();
}

//真实角色,你去结婚
class You implements Marry{
    @Override
    public void HappyMarry() {
        System.out.println("hunli");

    }
}

//代理角色,帮助你结婚
class WeddingCompany implements Marry{
    private Marry target;

    public WeddingCompany(Marry target) {
        this.target = target;
    }

    @Override
    public void HappyMarry() {
        before();
        this.target.HappyMarry();
        after();
    }

    private void after() {
        System.out.println("婚后");
    }

    private void before() {
        System.out.println("婚前");
    }
}

标签:Java,String,Thread,url,new,多线程,public,name
From: https://blog.csdn.net/lf_1234/article/details/137481594

相关文章

  • 使用JavaScript设置Tab栏自动切换
    在下面代码中设置了tab栏可以进行周期性的切换时间时5秒,也可以鼠标移到相应的位置进行切换。在允许过程中出现:Cannotreadpropertiesofundefined(reading'className')报错,不知道时什么原因还没有解决,希望大佬来指点一下!!!!<!DOCTYPEhtml><htmllang="en"><head><meta......
  • Java并发(二十四)----wait、notify、notifyAll、join区别与联系
    1、join是调用者轮询检查线程alive状态,执行后线程进入阻塞状态。如在线程B中调用线程A的join(),那线程B会进入到阻塞队列,直到join结束或中断线程B才开始进入阻塞队列。可以实现一个线程的顺序执行。t1.join();等价于下面的代码synchronized(t1){  //调用者线程进入t1......
  • 解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException
    解决badSQLgrammar[];nestedexceptionisjava.sql.SQLSyntaxErrorException解决SpringBoot中MySQL数据库报错“BadSQLGrammar”的问题目录解决SpringBoot中MySQL数据库报错“BadSQLGrammar”的问题问题描述解决步骤解决方案结论附:MySql常用配置参数及使用场景......
  • Java Tomcat7中使用Quartz2.2实现定时任务项目代码实例(demo)
    ​ 在Java中使用Quartz2.2结合Tomcat7实现定时任务是一种常见的需求,Quartz是一个强大的定时任务库,能够帮助开发者轻松实现复杂的定时任务调度。以下是一个简单的示例,展示如何在JavaWeb应用中集成Quartz来执行定时任务。 详细文档:JavaTomcat7中使用Quartz2.2实现定时任务......
  • 多线程
    参考转载自:.NET多线程-Broder-博客园(cnblogs.com)一、进程和线程定义进程:一个程序在服务器上运行时,占用的计算机资源合集,就是进程。线程:是程序能够独立运行的最小单位。线程具有进程所具有的特征,所以线程又叫轻型进程。二、多线程线程分为原生线程和托管线程,原生线程生......
  • Java登陆第四十天——Router路由守卫练习
    需求未登录无法访问除login页面练习1.使用vite创建项目,导入依赖npmcreatevite 选择vue+jsnpmi 导入基本依赖npmvue-router 导入路由依赖2.创建组件,login.vue、home.vue、list.vue仅展示home.vue组件,其他都一样。<scriptsetup></script><template><h3>我是hom......
  • 后端学习记录~~JavaSE篇(day03-流程控制语句-下-----循环语句)
    摘要:循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要通过修改循环变量使得循环判断条件为false,从而结束循环,否则循环将一直执行下去,形成死循环。一.for循环for(初始化语句①;循环条件语句②;迭......
  • java中的栈和队列
    java中的栈和队列栈特点:先进后出插入和删除只能在一段进行(栈顶),另一端称为(栈底)插入和删除的时候时间复杂度都是最理想的O(1)java中提供了一个类:Stack,并且实现了泛型方法:empty()检测栈是否为空peek()查看头部元素,不删除pop()删除头部元素,并返回删除的元素push()将该元素......
  • Java登陆第四十天——Router路由守卫
    路由守卫就是在切换页面的期间,执行的函数。 类似于Vue的钩子函数 类似于Setvlet的Filter(过滤器)路由守卫路由守卫,就是在路由切换期间执的函数。由vue-router提供的两个常见守卫(函数):全局前置守卫beforeEach和全局后置守卫afterEach语法格式如下:/*全局前置守卫beforeEa......
  • Java集合常用类及使用特点
    Java集合框架提供了一组接口和类,用于存储和操作对象集合。它包括常用的数据结构,如列表、集合、映射等,以及对应的实现类。主要接口和类:List(列表):允许重复元素,按照插入顺序存储。常用实现类有ArrayList(查询快、增删慢)和LinkedList(增删快、查询慢)。ArrayListvs.LinkedList:Ar......