Java多线程

并行和并发有什么区别?
  • 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

  • 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

  • 在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。

线程和进程的区别?
  • 进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。

  • 线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。

使用多线程进行下载代码如下:
方式一:
package Java.Thread;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
//创建线程方式一:继承Thread,重写run方法
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 downloader = new WebDownloader();
        downloader.download(url,name);
        System.out.println("下载了文件名"+name);

    }

    public static void main(String[] args) {
        TestThread2 t1 = new TestThread2("https://c-ssl.duitang.com/uploads/blog/202008/20/20200820180927_dfzpj.thumb.300_300_c.jpg","1.jpg");
        TestThread2 t2 = new TestThread2("https://c-ssl.duitang.com/uploads/item/202004/06/20200406193332_levbg.thumb.300_300_c.jpg","2.jpg");
        TestThread2 t3 = new TestThread2("https://c-ssl.duitang.com/uploads/item/202004/27/20200427160432_mhjwn.thumb.300_300_c.jpg","3.jpg");

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

class WebDownloader {
    public void download(String url,String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        }
        catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常");
        }
    }
}

方式二

package Java.Thread;

import org.apache.commons.io.FileUtils;

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

//创建线程方式2:实现runnable接口,重写run方法,执行线程需要丢入runnable接口,调用start方法
public class TestThread3 implements Runnable {
    private String url;
    private String name;

    public TestThread3(String url,String name){
        this.url=url;
        this.name=name;
    }

    @Override
    public void run() {
        WebDownLoader2 downLoader2 = new WebDownLoader2();
        downLoader2.download(url,name);
        System.out.println("下载了文件名" + name);
    }

    public static void main(String[] args) {
        TestThread3 t1= new TestThread3("https://dl.stream.qqmusic.qq.com/C400003qyCb24Rhq7G.m4a?guid=1009329214&vkey=EBAD796F5C4C03506E5A1AECD46DD5903E129E67F83DE2E68EF83DE43ED7A47C5AF920D9A762313F3DDBD776389A0E8BD53E181FF50F375B&uin=1064432866&fromtag=66","水山少年梦.mp3");
        TestThread2 t2 = new TestThread2("http://img1.gamedog.cn/2021/04/23/5649562-2104231049560.jpg","2.jpg");
        TestThread2 t3 = new TestThread2("http://img1.gamedog.cn/2021/04/23/5649562-2104231045460.jpg","3.jpg");

        new Thread(t1).start();
        new Thread(t2).start();
        new Thread(t3).start();
    }
}
class WebDownLoader2{
    public void download(String url,String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        }
        catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常");
        }
    }
}
1.得到服务器下载文件的大小,然后在本地设置一个临时文件和服务器端文件大小一致 a)获得访问网络地址 b)通过URL对象的openConnection()方法打连接,返回一个连接对象 c)设置请求头 i.setRequestMethod ii.setConnectTimeout iii.setReadTimeout d)判断是否响应成功 e)获取文件长度(getContentLength()) f)随机访问文件的读取与写入RandomAccessFile(file, mode) g)设置临时文件与服务器文件大小一致(setLength()) h)关闭临时文件 2.计算出每个线程下载的大小(始位置,结束位置) a)计算出每个线程下载的大小 b)for循环,计算出每个线程始、结束位置 c)最后一个线程处理 3.每创建好一次就要线程下载 a)构造方法 b)通过URL对象的openConnection()方法打连接,返回一个连接对象 c)设置请求头 i.setRequestMethod ii.setConnectTimeout d)判断是否响应成功(206) e)获取每个线程返回的流对象 f)随机访问文件的读取与写入RandomAccessFile(file, mode) g)指定始位置 h)循环读取 i.保存每个线程下载位置 ii.记录每次下载位置 iii.关闭临时记录位置文件 iv.随机本地文件写入 v.记录已下载大小 i)关闭临时文件 j)关闭输入流 4.为了杀死线程还能继续下载的情况下,从本地文件上读取已经下载文件的始位置 a)创建保存记录结束位置的文件 b)读取文件 c)将流转换为字符 d)获取记录位置 e)把记录位置赋给始位置 5.当你的n个线程下载完毕的时候我进行删除记录下载位置的缓存文件 a)线程下载完就减去 b)当没有正在运行的线程时切文件存在时删除文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蜜蜂127

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值